🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

3回答

5975閲覧

環境依存文字が含まれる文字列の正規表現のやり方

yukitoto

総合スコア53

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

1クリップ

投稿2021/01/15 06:59

編集2021/01/15 07:20

環境依存文字があたっている文字列の正規表現のやり方がわからず困っています。
なにか対応する方法はありますでしょうか?

javascript

1"22日 21:30".match(/22/); // true 2"????????日 ????????:????????".match(/22/); // false <- trueになってほしい

こちらのサイトを利用してそのような文字を確認することができます。
https://www.shapoco.net/plainstyle/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/01/15 07:01

それは「フォント」ではなく「環境依存文字」ではないでしょうか。
m.ts10806

2021/01/15 07:13

上記、前提として書いておいてください。 Windowsの場合、選択状態にして「変換」ボタン押すとそのように出てきます。そのサイトの説明にあるように「学術用の文字や記号を利用して擬似的にフォントを変更」されているためと思います。 全角文字は効きませんしね。
Zuishin

2021/01/15 07:36

/22/ でなく /????????/ とすればいいのでは?
yukitoto

2021/01/15 08:04

例として /22/ を利用したのですが、本当は数ある環境依存文字(フォント)に対応できるようにしたいのです。 ``` "????????日 ????????:????????".match(/(\\d+)日/); // これで日付を抽出する ```
otn

2021/01/15 12:23

あなたの言う「環境依存文字」を詳しく説明してください。
ikadzuchi

2021/01/16 09:24

「フォント」ではないにせよ「環境依存文字」と言うのも不適切だと思いますね。 ここで問題となっている差は「書体」や「タイプフェイス」でしょうか。
Zuishin

2021/01/16 10:02

質問のリンク先を見てみましたが、文字に割り当てられたコード自体が違うので、広い意味では「書体」かもしれませんが、それだと大きな誤解を招くように思います。全角と半角、「③」と「三」のような関係ですね。 これらに対応したフォントがインストールされているとは限らないので「環境依存文字」ではあると思いますが、PC ならたいてい表示できると思うので、「環境依存」でくくるのも少しカテゴライズの方法として古いように感じます。 無理やり一言で言うなら「数字記号」でしょうか。私の回答からリンクされている「数学英数字記号」に加えて他の記号も使用したいんでしょうから、なかなか共通認識の得られる短い言葉で表すのは難しいと思います。検索したい記号の一覧を作るところから始める必要があるでしょう。
ikadzuchi

2021/01/17 14:00

あ、すいません、Unicodeが言うにはこれは「Font variant」なのでフォントで正しいようです。 大きな誤解は招きますが。
Zuishin

2021/01/30 00:41

で、質問者はログインしてるのになぜ何も言わないんだ?
guest

回答3

0

数学では書体によって記号の意味するところが変わってきたりするので、その時に使う数学英数字記号ですね。

数学英数字記号-ウィキペディア

検索文字列中に現れる 2 という文字を "[2????????????????????]" という文字列に置換し、あらためてそれを正規表現として解釈させると現実的なコードになると思います。

JavaScript

1const convertDigitToMathematicalAlphanumericSymbols = src => { 2 const table = { 3 0: '[00????????????????????]', 4 1: '[11????????????????????]', 5 2: '[22????????????????????]', 6 3: '[33????????????????????]', 7 4: '[44????????????????????]', 8 5: '[55????????????????????]', 9 6: '[66????????????????????]', 10 7: '[77????????????????????]', 11 8: '[88????????????????????]', 12 9: '[99????????????????????]' 13 } 14 return src.replaceAll(/\d/g, a => table[a]); 15}; 16 17if ("????????日 ????????:????????".match(convertDigitToMathematicalAlphanumericSymbols("22"))) { 18 console.log("ありまぁす"); 19}

追記

node v15.5.0 において、このコードは正常に動作せず "9" を与えても検索が成功します。原因は今のところ不明ですが、node が対応していないために一つの文字が複数の文字と解釈されている可能性があります。

追記

JavaScript

1if ("????????日 ????????:????????".match(/[????]/)) { 2 console.log("success"); 3}

上記コードで success が表示されます。やはり node v15.5.0 が対応していないようです。

追記

JavaScript

1const convertDigitToMathematicalAlphanumericSymbols = src => { 2 const table = { 3 0: '(?:0|????|????|????|????|????)', 4 1: '(?:1|????|????|????|????|????)', 5 2: '(?:2|????|????|????|????|????)', 6 3: '(?:3|????|????|????|????|????)', 7 4: '(?:4|????|????|????|????|????)', 8 5: '(?:5|????|????|????|????|????)', 9 6: '(?:6|????|????|????|????|????)', 10 7: '(?:7|????|????|????|????|????)', 11 8: '(?:8|????|????|????|????|????)', 12 9: '(?:9|????|????|????|????|????)' 13 } 14 return src.replaceAll(/\d/g, a => table[a]); 15}; 16 17if ("????????日 ????????:????????".match(convertDigitToMathematicalAlphanumericSymbols("9"))) { 18 console.log("ありまぁす"); 19} else { 20 console.log("ありません"); 21}

キャラクターセットを使わない方針に変更しました。今度は大丈夫そうです。

投稿2021/01/15 08:19

編集2021/01/15 09:16
Zuishin

総合スコア28669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/01/15 08:22 編集

こうなりますよね。「変換先の文字全部持ってくる必要がある」という点で、あまり現実的ではないと私は判断しました。
Zuishin

2021/01/15 08:25

実は試してみると何を持ってきても「ありまぁす」になるので、この回答はどこか間違っているんだと思います。間違いを探してみます。
Zuishin

2021/01/15 08:43

文字セットを使わなければうまくいきました。やはり複数文字として解釈されていたようです。
tanaka1107

2021/01/17 01:35

console.log("????????日 ????????:????????".match(/[????]/)); console.log("????????日 ????????:????????".match(/[????]/u)); console.log("????????日 ????????:????????".match(/[????]/u)); > Array ["�"] > null > Array ["????"]
Zuishin

2021/01/17 03:32

なるほど。u フラグの使い方を誤解していました。これから正規表現を使うときには漏れなく u フラグをつけた方が良さそうですね。
guest

0

ベストアンサー

それらの特殊な書体の文字はたいてい、対応する普通の文字がUnicodeの規格として定義されていますので、その規格を参照して適切な対応関係を得ることが環境によっては可能です。「Chromeなどの検索機能を利用すると『1』として検索に引っかかる」というのもそれでしょう。
例えば以下のような定義が見られます。
getNumericValue()
https://www.fileformat.info/info/unicode/char/1d7ee/index.htm
しかしZuishinさんの修正前の回答がそれでしたが、どうやら非対応なのですね…。


追加です。
考えてみると大本のUnicodeのデータを示すべきでした。
こちらから辿れる、UnicodeData.txtがそれです。
例えばU+1D7EEを見ると
1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
とあります。
各要素の意味はこちらに書いてあり、ここで重要なのはDecomposition_Type・Decomposition_MappingおよびNumeric_Type・Numeric_Valueあたりです。
Decompositionは名前の通り組文字をそれぞれの文字に分解したり、名前からは想像がつかないものの今回のように特殊な1文字を普通の1文字にマッピングしたりしています。
それが今回「<font> 0032」ということで、こちらによれば<font>は「Font variant (for example, a blackletter form)」ということです。フォントなんですね。
そして対応する文字がU+0032「2」ということが分かります。Chromeが見ているのはたぶんこれです。
また数字についてはNumeric_Type・Numeric_Valueがあり、タイプは3種類ありますがまあ今回のような1桁の数字の文字ならどれも同じくその数値「2」を示します。

UnicodeのDecompositionができるような言語・実行環境ならこれを使うとよいのでしょう。JavaScriptで使えそうな気もしますが、実行環境も様々ありますし使えるものばかりでもないような気もします。

投稿2021/01/16 09:33

編集2021/01/17 14:11
ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

結論としては「本来意味する”フォント”ではなく、それっぽく見える別の文字・記号に置き換えているだけなので、無理」です。

matchに入れる文字列もそれらの文字記号にすれば通らなくはないと思いますが、現実的なコードにはなりません。

投稿2021/01/15 07:24

編集2021/01/15 07:25
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukitoto

2021/01/15 07:29

ご回答ありがとうございます。 Chromeなどの検索機能を利用すると「1」として検索に引っかかるのですが、これは内部的にそういった処理をしてるのでしょうか...?
m.ts10806

2021/01/15 07:31

ブラウザの仕様までは突っ込んでみないと分かりませんが、 JavaScriptとしては「別のもの」として解釈されている以上は、どうにもならない部分はあります。
Zuishin

2021/01/15 08:32

どうも私の回答の文字セットを使う方法ではできない可能性が高いのでこちら高評価しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問