javascript正则表达式中奇怪的空格

时间:2013-12-15 23:24:32

标签: javascript regex whitespace

我在javascript中看到了这个奇怪的正则表达式。

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

我跑了,我得到的输出全部被X取代 令人费解的是正则表达式中的白色空间。我删除了第一个空格,脚本将无法运行。我删除了第二个空白区域,我将一个“a”替换为两个“X”。 我想知道它是如何运作的。

3 个答案:

答案 0 :(得分:9)

空格实际上意味着匹配空格字符(U + 0020)。

密钥是跟随每个密钥的? quantifier,允许模式匹配" 0或1个空格"对于每一个,基本上使它们可选

因此,/ ?a ?/模式能够匹配:

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

并且,尝试删除任一空格将改变模式的含义:

  • 删除前导空格(/?a ?/g)实际上会产生SyntaxError,因为量词需要先对其进行量化。

  • 删除尾随空格(/ ?a?/g)在语法上是有效的,但?量词将适用于a,将可能的匹配更改为:

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

答案 1 :(得分:4)

?字符使空格在匹配时可选。

例如,这些字符串将替换为带有该正则表达式的X.

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

您可以找到有关此量词 here 的更多信息。

答案 2 :(得分:4)

' '匹配实际的空格字符。 ?量词表示匹配 10次。

您的正则表达式执行以下操作:

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

它将符合以下情况:

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

您的正则表达式将匹配a b a b a b a b a b a b a b使用a(全局修饰符)在输入字符串中g。含义所有匹配(首次匹配时不返回)

  • 如果删除开头的空格字符,则前一个标记无法量化,因此失败

  • 如果您保留空格字符但删除第一个?,它将失败,因为它看起来与空格字符匹配,但输入中不存在空格字符

  • 如果您删除了第二个空格字符,它仍会成功匹配,a可选。