Javascript正则表达式

Javascript正则表达式,javascript,regex,Javascript,Regex,我试图理解正则表达式如何处理特殊字符的文本搜索。这是我能想到的最简单的例子来说明我的问题。 我在寻找文字。一串 当我这样做的时候 'sp.o'.search('.') //it returns 0 which makes sense. 然后我阅读了MDN并根据它们 'sp.o'.search('\.') // it returns 0 ! // I come from vim flavor regex // It does not make sense to me =(

我试图理解正则表达式如何处理特殊字符的文本搜索。这是我能想到的最简单的例子来说明我的问题。

我在寻找文字。一串
当我这样做的时候

 'sp.o'.search('.')
 //it returns 0 which makes sense.
然后我阅读了MDN并根据它们

 'sp.o'.search('\.')
 // it returns 0 !
 // I come from vim flavor regex
 // It does not make sense to me =(

我到底错过了什么!
(这种行为在Google Chrome和NodeJS中都存在,我在其他地方都没有尝试过!)

您使用的不是正则表达式,而是字符串。使用:

/regexphere/
它的工作原理是:

'sp.o'.search(/\./); // 2
但在您的情况下,
.indexOf
是您的朋友:

'sp.o'.indexOf('.'); // 2

您正在使用字符串而不是表达式进行搜索。试试这个:

'sp.o'.search(/\./); // should return 2

你的用法几乎是正确的。正如其他人所指出的,您可以使用正则表达式文本而不是字符串。但弦也起作用。根据有关搜索方法的说明:

如果传递了非RegExp对象obj,则使用新的RegExp(obj)将其隐式转换为RegExp

之所以
'\\.
有效,而
'\.
无效,是因为在javascript字符串中,必须转义反斜杠才能使其成为反斜杠。否则,它将总是试图逃避前面的角色。在本例中,
不会转义到任何内容。如果在javascript控制台中计算字符串,您将得到以下结果:

'\.' // => '.'
'\\.' // => '\.'
然后,该字符串将被传递到幕后的
RegExp
对象。如果你自己这样做,你会得到:

new RegExp('\.') // => /./
new RegExp('\\.') // => /\./

其他人建议使用regex文本(例如
/\./
)而不是字符串作为
.search
的参数。这两种方法都有效,但我会使用regex文本,因为它更明显,更漂亮。

因为它是一个字符串,
\
表示要转义下一个字符。但是
不是一个特殊的字符串,所以它只是将其视为一个文本

"\." === "." 
您希望转义斜杠(
\
)而不是句点,这就是为什么
“\\\”
生成您想要的文本字符串
\.
。或者更明确地说:

“\\”+“==”\\.“//或文字:\.


但是其他帖子是正确的,您可能只想使用正则表达式文字,而不是将字符串解析为正则表达式。

如果您只是在搜索固定文字,为什么不使用:

if( 'sp.o'.indexOf('.') !== -1) ...

正则表达式总是比字符串搜索更昂贵。

可以使用字符串,它们只是转换成正则表达式。@benekastah:我刚刚注意到了这一点。不过,我不建议使用它。这在大多数平台上安全吗?@pimvdb-True。您的
.indexOf
建议更好+1@JamesAndino:就我所知,对于字符串,
indexOf
得到了广泛的支持。但数组的
索引的情况并非如此。为什么要使用正则表达式搜索简单的文本
.indexOf()
要便宜得多。我想问一下REGEX。我想我的头衔让人困惑。我只是举了一个最简单的例子,每个人的抱怨都很公平。我澄清了我的问题。
if( 'sp.o'.indexOf('.') !== -1) ...