2013-12-15 56 views
4

我在javascript中看到了這個奇怪的正則表達式。javascript正則表達式中的奇怪空格

string = "abababababababa"; 
string=string.replace(/ ?a ?/g,"X"); 
alert(string); 

我跑了,我得到的輸出完全是由X 更令人不解的是空格的正則表達式替換。我刪除第一個空格,腳本不會運行。我刪除第二個空格,我得到一個「a」替換爲兩個「X」。 我不知道它是如何工作的。

+0

專業提示:使用[在線正則表達式編輯器](http://regex101.com) – HamZa

回答

9

該空間實際上意味着匹配空格字符(U + 0020)。

的關鍵是,如下他們每個人,允許要匹配的模式「0或1空間」對於每個,基本上使它們可選? quantifier

所以,/ ?a ?/模式能夠匹配:

  • "a"
  • "a "
  • " a"
  • " a "

而且,試圖刪除任何空間會改變的意義的模式:

  • 除去最主要的空間(/?a ?/g)實際上導致SyntaxError作爲量詞要求他們面前的東西量化。

  • 刪除尾部空間(/ ?a?/g)在語法上是有效的,但隨後的?量詞將適用於a,改變可能的匹配到:

    • ""
    • "a"
    • " "
    • " a"
+2

而且,關鍵的是,空間和它的量詞是正則表達式中的一個「原子」,所以不應該被分割半。刪除第一個空格會留下一個沒有量化的「?」量詞(因此腳本失敗);刪除第二個空格將「?」量詞附加到「a」,形成了「可能是空格,然後可能是」的相當奇怪的模式。 – IMSoP

+0

啊,我明白了。我從未見過這種匹配空格字符的方法(而不是\ s)。謝謝你們的幫助! – Flmhdfj

4

?字符使匹配中的空格爲可選。

例如,這些字符串將被替換爲帶有該正則表達式的X.

> "a" 
> " a" 
> " a " 
> "a " 

您可以找到有關這個量詞here更多信息。

4

' '與實際的空格字符匹配。 ?量詞表示匹配10次。

你的正則表達式執行以下操作:

?   ' ' optional space character 
a   match 'a' 
?   ' ' optional space character 

這將符合以下情況:

  • 'a'
  • 'a '
  • ' a'
  • ' a '

你的正則表達式將使用g(全球改性劑)你輸入的字符串匹配a b a b a b a b a b a b a b a。這意味着所有的比賽如果你在開始前令牌是無法量化,因此將失敗刪除空格字符(不上的第一場比賽返回)

  • 如果離開了空格字符,但除去第一?失敗,因爲它看起來匹配空格字符,但空格字符不輸入存在。

  • 如果您刪除第二個空格字符,它仍然會成功在此處選擇a