带有右方括号字符的javascript匹配方法

时间:2015-05-06 15:24:23

标签: javascript regex match

如何在javascript正则表达式中使用右方括号作为字符?

"Acb[".match('[\(, \), \[]')

返回:

["["]

但是当我将结束方括号添加为字符时,它不起作用:

"Acb[".match('[\(, \), \[, \]]')
null


"Acb]".match('[\(, \), \[, \]]')
null

2 个答案:

答案 0 :(得分:2)

"Acb]".match(/[\(, \), \[, \]]/)返回["]"]。您应该使用/而不是引号来表示正则表达式以避免转义问题

你也不需要逃避大部分角色。 "Acb]".match(/[()[, \]]/)将匹配(,),[,],逗号或空格

有关角色类的信息可以是found here

答案 1 :(得分:1)

@wolffer-east's answer是正确的。我发帖只是为了解释为什么他/她的回答有效。

According to MDNString.prototype.match的参数可以是字符串而不是正则表达式:

  

参数

     

<强>的regexp

     

正则表达式对象。如果是非RegExp对象obj     传递后,使用new隐式转换为RegExp     正则表达式(OBJ)。

因此,使用斜杠来划分正则表达式的工作原因并不是很明显,而使用引号并不是很明显。原因是这两个定界形式以不同方式处理反斜杠转义。当你写

"Acb[".match('[\(, \), \[, \]]')

在创建任何正则表达式之前,引号首先应用反斜杠转义。由于反斜杠括号和反斜杠括号不是特殊的转义序列,因此它们分别转换为括号和括号。因此:

'[\(, \), \[, \]]'

相当于:

'[(, ), [, ]]'

之后才调用RegExp构造函数。此时,右括号不再被转义,并被视为字符类的结束标记,而不是类中的字符。您可以通过转义反斜杠来避免这种情况:

"Acb[".match('[\(, \), \[, \\]]')

-

您似乎也在使用逗号分隔角色类中的字符 - 这是不必要的,不需要分隔符。因此,更简单的表达是:

"Acb[".match(/[()[\]]/)

"Acb[".match('[()[\\]]')