Javascript Regular Exp

时间:2012-02-10 18:20:13

标签: javascript regex

我试图了解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 =(

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp

 'sp.o'.search('\\.')
 // returns 2 !
 // the correct out put I am looking for

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

5 个答案:

答案 0 :(得分:4)

您没有使用正则表达式而是使用字符串。使用:

/regexphere/

有效:

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

但在你的情况下,.indexOf是你的朋友:

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

答案 1 :(得分:4)

您的使用几乎是正确的。正如其他人所说,您可以使用正则表达式文字而不是字符串。但字符串也有效。根据搜索方法的Mozilla docs

  

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

'\\.'工作原因而'\.'不起作用的原因是因为在javascript字符串中,您必须将反斜杠转义为反斜杠。否则它总是试图逃避它前面的角色。在这种情况下,'.'不会逃避任何事情。如果你在javascript控制台中评估你的字符串,你会得到这个:

'\.' // => '.'
'\\.' // => '\.'

然后将字符串传递给幕后的RegExp对象。如果你自己这样做,这就是你得到的:

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

其他人建议使用正则表达式文字(例如/\./)而不是字符串作为.search的参数。两者都有效,但我会使用正则表达式文字,因为它更明显,更漂亮。

答案 2 :(得分:4)

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

"\." === "." 

您希望转义斜杠(\)而不是句点,这就是"\\."生成您想要的文字字符串\.的原因。或者更明确:

"\\" + "." === "\\." // or a literal: \.

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

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:1)

您正在搜索字符串,而不是表达式。试试这个:

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