我试图了解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中我还没有尝试过任何其他地方!)
答案 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