我在javascript中看到了这个奇怪的正则表达式。
string = "abababababababa";
string=string.replace(/ ?a ?/g,"X");
alert(string);
我跑了,我得到的输出全部被X取代 令人费解的是正则表达式中的白色空间。我删除了第一个空格,脚本将无法运行。我删除了第二个空白区域,我将一个“a”替换为两个“X”。 我想知道它是如何运作的。
答案 0 :(得分:9)
空格实际上意味着匹配空格字符(U + 0020)。
密钥是跟随每个密钥的?
quantifier,允许模式匹配" 0或1个空格"对于每一个,基本上使它们可选。
因此,/ ?a ?/
模式能够匹配:
"a"
"a "
" a"
" a "
并且,尝试删除任一空格将改变模式的含义:
删除前导空格(/?a ?/g
)实际上会产生SyntaxError
,因为量词需要先对其进行量化。
删除尾随空格(/ ?a?/g
)在语法上是有效的,但?
量词将适用于a
,将可能的匹配更改为:
""
"a"
" "
" a"
答案 1 :(得分:4)
答案 2 :(得分:4)
' '
匹配实际的空格字符。 ?
量词表示匹配 1
或0
次。
您的正则表达式执行以下操作:
? ' ' 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
可选。