【问题标题】:Regex match: does not contain char on beginning of a string正则表达式匹配:字符串开头不包含字符
【发布时间】:2015-02-26 02:33:47
【问题描述】:

抽象问题

匹配不以 '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

返回片段(即标签之间的组='test',例如'$2')。

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

【问题讨论】:

  • 你用什么语言做这个?
  • javascript,不过没关系
  • 您的要求是“匹配不包含字符的字符串”,# 是您要匹配的字符吗?
  • 1. string 不包含 # = 匹配 2. 返回此 (1) fragmentstring

标签: javascript regex regex-negation


【解决方案1】:

试试这个

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

代替:

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

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

亮点:

  • (?!#) 是一个否定的前瞻 - 不是#
  • “片段”非常笼统:所以我假设 .(在 (.*) 中)没有任何意义。
  • 我删除了原始正则表达式中的第一个和最后一个捕获组(即将(&lt;XX&gt;)(&lt;\/XX&gt;) 分别替换为&lt;XX&gt;&lt;\/XX&gt;)。如果您不需要捕获组,请不要使用它们。
  • 我从您的原始正则表达式中删除了显式量词{1}。这两种情况也是不必要的。

【讨论】:

    【解决方案2】:

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

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

    以下正则表达式:

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

    也允许&lt;XX&gt;&lt;/XX&gt;为空的情况。

    【讨论】:

      猜你喜欢
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 2015-12-11
      相关资源
      最近更新 更多