簡體   English   中英

/(\S)\1(\1)+/g 匹配三個相等的非空白字符的所有出現

[英]/(\S)\1(\1)+/g matching all occurrences of three equal non-whitespace characters following each other

它給出:/(\S)\1(\1)+/g 匹配三個相等的非空白字符的所有出現。

我不明白為什么在 (\S) 和第二個 (\1) 周圍有 (),但在第一個 (\1) 周圍沒有。 任何人都可以幫助解釋上述正則表達式的工作原理嗎?

來源: http://www.javascriptkit.com/javatutors/redev2.shtml

提前謝謝。

\S需要括號來捕獲其值,因此您可以使用\1返回捕獲的值。 \1表示“匹配捕獲組 #1 匹配的相同文本”。

我相信這個正則表達式有問題。 你說你想匹配“三個相等的非空白字符”。 但是+將使此匹配 3 個或更多個相等的、連續的非空白字符。

末尾的g表示“將此正則表達式應用於整個輸入字符串,或全局”。

第二組括號不是必需的。 它不必要地第二次捕獲重復的字符,同時匹配與此正則表達式相同的字符串:

/(\S)\1\1+/g

另外,正如@AlexD 指出的那樣,描述應該說明它至少匹配三個字符。 如果您在字符串BONK中將正則表達式替換為fooxxxxxxbar

'fooxxxxxxbar'.replace(/(\S)\1\1+/g, 'BONK')

..根據他們的描述,您可能期望結果是fooBONKBONKbar ,因為有兩組三個“x”。 但實際上結果是fooBONKbar 第一個\1匹配第二個 'x', \1+匹配第三個 'x'和它后面的任何 'x '。 如果他們只想匹配三個字符,則應該將+關閉。

我注意到其他幾個類似的草率描述,加上至少一個徹底的錯誤: \B等同於(?!\b) (不是單詞邊界的 position),而不是[^\b] (不是退格符的字符) ). 就此而言,他們對單詞邊界的描述——“單詞和空格之間的 position”——也是錯誤的。 單詞邊界不是由任何特定字符(如空格)定義的——事實上,它也可以是沒有創建單詞的任何字符。 字符串:

Word

...以單詞邊界開頭,因為 'W' 是一個單詞字符,並且作為第一個,它前面沒有另一個單詞字符。 類似地,'d' 后面沒有跟另一個單詞字符,所以字符串的末尾也是一個單詞邊界。

此外,正則表達式不知道words ,只知道 word characters 單詞字符的定義可能因正則表達式風格和 Unicode 或區域設置而異,但它始終包含[A-Za-z0-9_] (ASCII 字母和數字加上下划線)。 單詞邊界只是一個 position,位於這些字符之一和任何其他字符(或沒有其他字符,如我之前解釋的)之間。

如果您想了解正則表達式,我建議您忘記該站點並從這里開始: regular-expressions.info

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM