如何在javascript正则表达式中使用右方括号作为字符?
"Acb[".match('[\(, \), \[]')
返回:
["["]
但是当我将结束方括号添加为字符时,它不起作用:
"Acb[".match('[\(, \), \[, \]]')
null
"Acb]".match('[\(, \), \[, \]]')
null
答案 0 :(得分:2)
"Acb]".match(/[\(, \), \[, \]]/)
返回["]"]
。您应该使用/
而不是引号来表示正则表达式以避免转义问题
你也不需要逃避大部分角色。 "Acb]".match(/[()[, \]]/)
将匹配(,),[,],逗号或空格
有关角色类的信息可以是found here
答案 1 :(得分:1)
@wolffer-east's answer是正确的。我发帖只是为了解释为什么他/她的回答有效。
According to MDN,String.prototype.match
的参数可以是字符串而不是正则表达式:
参数
<强>的regexp 强>
正则表达式对象。如果是非RegExp对象obj 传递后,使用new隐式转换为RegExp 正则表达式(OBJ)。
因此,使用斜杠来划分正则表达式的工作原因并不是很明显,而使用引号并不是很明显。原因是这两个定界形式以不同方式处理反斜杠转义。当你写
"Acb[".match('[\(, \), \[, \]]')
在创建任何正则表达式之前,引号首先应用反斜杠转义。由于反斜杠括号和反斜杠括号不是特殊的转义序列,因此它们分别转换为括号和括号。因此:
'[\(, \), \[, \]]'
相当于:
'[(, ), [, ]]'
之后才调用RegExp
构造函数。此时,右括号不再被转义,并被视为字符类的结束标记,而不是类中的字符。您可以通过转义反斜杠来避免这种情况:
"Acb[".match('[\(, \), \[, \\]]')
-
您似乎也在使用逗号分隔角色类中的字符 - 这是不必要的,不需要分隔符。因此,更简单的表达是:
"Acb[".match(/[()[\]]/)
或
"Acb[".match('[()[\\]]')