/(\S)\1(\1)+/g は、互いに続く 3 つの等しい非空白文字の出現すべてに一致します。
(\S) と 2 番目 (\1) の周りに () があるのに、1 番目 (\1) の周りにない理由がわかりません。上記の正規表現がどのように機能するかを説明するのを手伝ってくれる人はいますか?
ソース: http://www.javascriptkit.com/javatutors/redev2.shtml
事前にthnx。
/(\S)\1(\1)+/g は、互いに続く 3 つの等しい非空白文字の出現すべてに一致します。
(\S) と 2 番目 (\1) の周りに () があるのに、1 番目 (\1) の周りにない理由がわかりません。上記の正規表現がどのように機能するかを説明するのを手伝ってくれる人はいますか?
ソース: http://www.javascriptkit.com/javatutors/redev2.shtml
事前にthnx。
で値を取得する\S
には括弧が必要なので、取得した値を で参照できます\1
。\1
「キャプチャグループ#1が一致したのと同じテキストに一致する」ことを意味します。
この正規表現には問題があると思います。「3 つの等しい非空白文字」に一致させたいと言いました。ただし、+
は、これを 3つ以上の連続する非空白文字に一致させます。
最後のg
は、「この正規表現を入力文字列全体またはグローバルに適用する」ことを意味します。
2 番目の括弧のセットは必要ありません。この正規表現と同じ文字列を照合しながら、繰り返される文字を不必要にもう一度キャプチャします。
/(\S)\1\1+/g
また、@AlexD が指摘したように、説明には、少なくとも3 文字と一致することが記載されている必要があります。BONK
その正規表現を文字列で置き換えた場合fooxxxxxxbar
:
'fooxxxxxxbar'.replace(/(\S)\1\1+/g, 'BONK')
fooBONKBONKbar
..3つの「x」のセットが 2 つあるため、結果はその説明からのものであると期待するかもしれません。しかし、実際には結果は次のようになりfooBONKbar
ます。1\1
番目は 2 番目の「x」と\1+
一致し、3 番目の「x」とそれに続くすべての「 x」と一致します。3 文字だけを一致させたい場合は、+
オフにしておくべきでした。
私は、そのような他のいくつかのずさんな説明に加えて、少なくとも 1 つの完全なエラーに気付きました: \B
is equal to (?!\b)
(a position that's not a word boundary), not [^\b]
(a character that's not a backspace)。さらに言えば、単語の境界、つまり「単語とスペースの間の位置」についての彼らの説明も間違っています。単語の境界は、スペースなどの特定の文字によって定義されるわけではありません。文字列:
Word
...「W」は単語の文字であり、最初にあるため、単語の境界で始まり、別の単語の文字が先行していません。同様に、'd' の後に別の単語文字が続くことはないため、文字列の末尾も単語の境界になります。
また、正規表現は words からは認識せず、単語の文字のみを認識します。単語の文字の定義は、正規表現のフレーバーと Unicode またはロケールの設定によって異なりますが、常に[A-Za-z0-9_]
(ASCII 文字と数字とアンダースコア) が含まれます。単語の境界とは、これらの文字の 1 つと他の文字 (または、前に説明したように、他の文字がない) の間の位置です。
正規表現について学びたい場合は、そのサイトを忘れて、代わりにここから始めることをお勧めします: regular-expressions.info。