令人烦恼和奇怪的正则表达式问题:'io \.' 得到一个关于'功能'这个词的匹配

Joã*_*imo 4 javascript regex escaping node.js

从节点REPL的事情,

> 'function'.search('io\.')
5
Run Code Online (Sandbox Code Playgroud)

我真的需要它只匹配"io".而不是"功能"或中间只有"io"的东西......

更奇怪的事情:

> 'io'.search('io\.')
-1
> 'ion'.search('io\.')
0
Run Code Online (Sandbox Code Playgroud)

所以看来我没有逃脱点角色..?但我和"\"......对吗?我在http://www.regextester.com/http://regexpal.com/上进行了测试,它的工作方式与我认为应该有效的方式相同.

我究竟做错了什么 ?node.js中的正则表达式与我习惯的有些不同吗?

EDIT1:在Google Chrome的javascript控制台中,我也得到了

'function'.search('io\.')
5
Run Code Online (Sandbox Code Playgroud)

所以这可能是一个v8的事情......对吗?

EDIT2:我从Firefox的javascript控制台得到了相同的结果,所以它不是v8的东西......这里发生了什么?我真的很困惑......

Med*_*o42 8

你的正则表达式是对的,但是你必须对它进行编码以便将它放入字符串中.所以,你的(正确的)正则表达式如下所示:

io\.
Run Code Online (Sandbox Code Playgroud)

但是,反斜杠也是字符串转义字符.要创建包含该正则表达式的字符串,您必须转义反斜杠:

'io\\.'
Run Code Online (Sandbox Code Playgroud)

你写它的方式,字符串实际包含io.,正确匹配function.

  • 值得一提的是,在JavaScript中,`/ io\./`也适用于定义regexp而无需处理双重转义`\` (8认同)

Max*_*Max 6

这里的问题是反斜杠在两个级别用作转义字符:字符串文字和正则表达式.例如'\\',包含单个反斜杠的字符串(如果在REPL中键入,则可以看到).

有两种选择:

  • 转义反斜杠:'\\.'是包含反斜杠和点的字符串,这是一个匹配点的正则表达式.

  • 使用正则表达式文字: /io\./

    > 'function'.search(/\./)
    -1
    
    Run Code Online (Sandbox Code Playgroud)