web-dev-qa-db-ja.com

Javascript-正規表現-単語境界(\ b)の問題

正規表現で\bとギリシャ文字を使用するのに問題があります。

この例[a-zA-ZΆΈ-ώἀ-ῼ]*は、必要なすべての単語(ギリシャ語と英語の両方)をマークすることに成功しました。ここで、2文字の単語を検索したいとします。英語の場合、私は this:\b[a-zA-Z]{2}\bのようなものを使用します。ギリシャ語の単語を2文字でマークすることに成功する正規表現を書くのを手伝ってくれませんか。 (なぜですか?私の最終的な目標はそれらを削除することです)。

使用されるテキスト:

ギリシャ単調:Τογάρούνκαιπαρ 'υμίνλεγόμενον、ώςποτεΦαέθωνΗλίουπαίςτοτουπατρόςάρμαζεύξαςδιατομήδυνατόςείναικατάτηντουπατρόςοδόνελαύνειντατ' επίτηςγήςξυνέκαυσεκαιαυτόςκεραυνωθείςδιεφθάρη、τούτομύθουμένσχήμαέχον λέγεται、τοδέαληθέςεστιτωνπερίγήνκαικατ'ουρανόνιόντωνπαράλλαξιςκαιδιάμακρόν.

ギリシャPOLYTONIC:Τὸγὰροὖνκαὶπαρ 'ὑμῖνλεγόμενον、ὥςποτεΦαέθωνἩλίουπαῖςτὸτοῦπατρὸςἅρμαζεύξαςδιὰτὸμὴδυνατὸςεἶναικατὰτὴντοῦπατρὸςὁδὸνἐλαύνειντὰτ' ἐπὶτῆςγῆςξυνέκαυσεκαὶαὐτὸςκεραυνωθεὶςδιεφθάρη、τοῦτομύθουμὲνσχῆμαἔχον λέγεται、τὸδὲἀληθέςἐστιτῶνπερὶγῆνκαὶκατ」οὐρανὸνἰόντωνπαράλλαξιςκαὶδιὰμακρὸνχρόνονγιγνομένητῶνἐπὶτῆςγῆςπυρὶπολλῷφθορά。

英語:実は、あなたの国と私たちの国で語られている話は、かつてヘリオスの息子であるフェートンが父親の戦車をくねらせたのですが、父親がたどったコースに沿ってそれを運転できなかったためです。 、地球上にあったものをすべて燃やし、サンダーボルトによって彼自身が死んだ-その話は、言われているように、伝説のファッションを持っていますが、それの真実は天国での体の移動の発生にあります地球の周りを移動し、長い間隔で繰り返される激しい火による地球上のものの破壊。

これまでに試したこと:

// 1
txt = txt.replace(/\b[a-zA-ZΆΈ-ώἀ-ῼ]{2}\b/g, '');

// 2
tokens = txt.split(/\s+/);
txt = tokens.filter(function(token){ return token.length > 2}).join(' ');

// 3
tokens = txt.split(' ');
txt = tokens.filter(function(token){ return token.length != 3}).join(' ') );

ここで私の質問に2と3が提案されました: Javascript-regex-指定された長さの単語を削除する方法

[〜#〜]編集[〜#〜]

また読む:

17
tgogos

Javascriptには後読み機能がなく、Wordの境界は\w文字クラスのメンバーでのみ機能するため、唯一の方法はグループを使用することです(置換する場合はグループをキャプチャします)。

(?m)(^|[^a-zA-ZΆΈ-ώἀ-ῼ\n])([a-zA-ZΆΈ-ώἀ-ῼ]{2})(?![a-zA-ZΆΈ-ώἀ-ῼ])

2文字の単語を削除する例:

txt = txt.replace(/(^|[^a-zA-ZΆΈ-ώἀ-ῼ\n])([a-zA-ZΆΈ-ώἀ-ῼ]{2})(?![a-zA-ZΆΈ-ώἀ-ῼ])/gm, '\1');
13

\ Sを使用できます

「Word文字とこれらの文字」に一致するものを書くのではなく、空白以外に一致する正規表現を使用する方が適切な場合があります。

\S

範囲は広くなりますが、作成/使用は簡単です。

それがtoo広い場合は、包括的リストではなく排他的リストを使用します。

[^\s\.]

つまり、空白および以外の文字はドットではありません。このようにして、例外に追加することも簡単です。

\ bを使おうとしないでください

単語の境界 none-ascii文字では機能しません これは簡単に説明できます。

> "yay".match(/\b.*\b/)
["yay"]
> "γaγ".match(/\b.*\b/)
["a"]

したがって、\bを使用してギリシャ文字を含む単語を検出することはできません。すべての文字が一致する境界です。

2文字の単語に一致

次のパターンを使用して、2つの文字の単語を一致させることができます。

pattern = /(^|[\s\.,])(\S{2})(?=$|[\s\.,])/g;

(より正確には、2つの空白のないシーケンスに一致します)。

あれは:

(^|[\s\.,]) - start of string or whitespace/punctuation (back reference 1)
(\S{2})     - two not-whitespace characters (back reference 2)
($|[\s\.,]) - end of string or whitespace/punctuation (positive lookahead)

そのパターンをこのように使用して、一致する単語を削除できます。

"input string".replace(pattern);

これが jsfiddle で、質問のテキストで使用されているパターンを示しています。

6
AD7six

次のようなものを試してください。

\s[a-zA-ZΆΈ-ώἀ-ῼ]{2}\s
1
disklosr