【问题标题】:Full match only if the capturing group encountered once仅当捕获组遇到一次时才完全匹配
【发布时间】:2019-02-17 23:50:48
【问题描述】:

图案:

(test):(thestring) 

我想要的是完全匹配,前提是之前只有一个test:

test:thestring

但在这种情况下不会完全匹配:

test:test:thestring

我尝试了限定符,但没有成功。

需要帮助

【问题讨论】:

  • 使用负前瞻确保test 后面没有test
  • 我还有完全匹配: (?!(test:) ) (thestring) 给出完全匹配的字符串
  • 你能发布你目前拥有的正则表达式吗? (还有你用的是什么语言?)
  • C#,正则表达式:(test) : (thestring),示例:test:test:thestring 不应该匹配
  • 对这个例子有点不确定,但在字符串开头的一个否定的lookbehind确保只有test:thestring匹配(这是一个非常特殊的情况):(?<!.)(test:thestring)....@987654321 @

标签: regex capturing-group


【解决方案1】:

如果您想要完全匹配并且应该只进行一次测试:在 test:string 之前,您可以断言字符串 ^ 的开头,使用否定前瞻 (?:(?!test:).) 来匹配任何字符(如果在右侧未测试:

然后匹配test:thestring,后跟一个否定的前瞻(?:(?!test:thestring).)*,如果右侧不是test:thestring,则匹配任何字符,并断言字符串的结尾$

^(?:(?!test:).)*test:thestring(?:(?!test:thestring).)*$

Regex demo

【讨论】:

    【解决方案2】:
    ^((?!test:).)*(test:thestring)
    

    See in action

    【讨论】:

      【解决方案3】:

      试试这个模式:^(?!.*((?(?<=^)|(?<=:))test(?=(:|$))).*(?1)).+$

      主要部分是((?(?<=^)|(?<=:))test(?=(:|$))),如果它前面有冒号:或在行首,后面跟冒号:或行尾,则匹配test

      (?(?<=^)|(?<=:)) 这是(?<=(:|^)) 的解决方法,但lookbehinds 必须具有固定长度。

      然后我们反向引用第一个捕获组(?1),看看是否还有其他test

      整个模式被置于负前瞻(?!...) 中,以匹配与上述模式不匹配的所有内容(test 匹配不止一次)。

      Demo

      【讨论】:

      • 在示例中它仍然与asdaf:test:asda匹配
      • @Nordle 你说得对,尽量让所有内容保持一般性。
      • 是的,这是一个很好的正则表达式,你已经得到了我的 +1
      【解决方案4】:

      对于这个非常具体的案例:

      (?<!.)(test:thestring)

      Regex101

      它所做的只是搜索字符串test:thestring 并确保它之前没有字符。 (使用 Michał Turczyn 的正则表达式进行通用搜索!)

      【讨论】:

        猜你喜欢
        • 2013-07-07
        • 2016-09-21
        • 1970-01-01
        • 2014-06-29
        • 1970-01-01
        • 2020-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多