当我使用javascript写正则表达式。
var regex = new RegExp("^[ ]{"+p1.length+"}\* ([^\n]*)", "gm")
顺便说一句,我有alert(p1.length)
它的value 0
。
我收到了错误:
SyntaxError:无效的正则表达式:无需重复
为什么?
这是同样的错误
var regex = new RegExp("^ {"+p1.length+"}\* ([^\n]*)", "gm")
但这是对的:
var r="^ {"+p1.length+"}[0-9]+\. ([^\n]*)"
var regex = new RegExp(r, "gm")
我的问题是为什么???
var regex = new RegExp("^ {"+p1.length+"}[*] ([^\n]*)", "gm") //this is ok
var regex = new RegExp("^ {"+p1.length+"}\\* ([^\n]*)", "gm") //and this is ok too.
所以当我们使用字符串构建一个正则表达式时,我们需要加倍\\它就是这样的技巧。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
{n}匹配前面表达式的n次出现。 N必须是正整数。 例如,/ a {2} /不匹配' a' in" candy,"但它确实匹配了所有的" caandy,"和前两个人在" caaandy。"
所以我的使用{0}是对的,没问题。 问题是我们需要\\在字符串中构建正则表达式,就像@Andreas说的那样,谢谢。
答案 0 :(得分:3)
首先,你没有逃脱你的正则表达。你应该这样做......
你的2个错误的正则表达式有两个不同的错误。
您的第一个尝试用“0次或更多次”来量化[ ]{0}
。
[ ]{0}
重复100或1000或多次仍然是空字符串。这意味着正则表达式永远不会停止匹配,如果这是有效的,因为它不会继续匹配[ ]{0}*
之后的任何其他字符。
你的第二个正则表达式试图重复^
0次。
^
不是一个字符,它只是一个零宽度的位置 - 字符串的开头。像\b
这样的其他“位置”也是如此。彼此相邻的字符串不能有2个“开始”。
我现在将解释为什么编辑中的两个正则表达式有效。
[*]
是一个字符类。在一个字符类中,*
失去了“零次或多次”的含义,变成了字面意思。所以你只是在没有空格后匹配字符*
。
\\*
未转义只是\*
。这里*
再次失去意义,因为它是在反斜杠之后。