正则表达式匹配:字符串开头不包含char

时间:2014-12-29 22:10:44

标签: javascript regex regex-negation

抽象问题

匹配不以' char'开头的字符串并返回匹配。

我的正则表达式(不完美):

/(<XX>){1}([^#]*)(<\/XX>){1}/ig

确实

<XX>#test</XX> // not matched
<XX>test</XX> // matched + return 'test'
<XX>te#st</XX> // not matched

但应该

<XX>#test</XX> // not matched
<XX>test</XX> // matched + return test
<XX>te#st</XX> // matched + return te#st

plus 返回片段(即标签之间的组=&#39;测试&#39;,例如&#39; $ 2&#39;)。

问题示例https://www.regex101.com/r/vT9kS7/1

2 个答案:

答案 0 :(得分:2)

试试这个

<XX>(?!#)(.*)<\/XX>

而不是:

(<XX>){1}([^#]*)(<\/XX>){1}

您可以在fork of your fiddle中查看更新的正则表达式。

亮点:

  • (?!#)是一个负面的预测 - 不是#
  • “片段”很通用:所以我对.(.*))中没有任何内容。
  • 我删除了原始正则表达式中的第一个和最后一个捕获组(即分别用(<XX>)(<\/XX>)替换<XX><\/XX>。如果您不需要捕获组,请不要使用它们。
  • 我从原始正则表达式中删除了显式量词{1}。它的两个实例都是不必要的。

答案 1 :(得分:0)

根据您的描述和测试用例,以下工作:

/(<XX>)([^#].*)(<\/XX>)/ig

以下正则表达式:

/(<XX>)([^#].*|)(<\/XX>)/ig

也会允许空<XX></XX>