【问题标题】:How to not match character in capturing group如何在捕获组中不匹配字符
【发布时间】:2019-10-13 14:20:26
【问题描述】:

我有一个编号为 2 的捕获 grp,它捕获了一个数字,但我需要正则表达式来匹配除 \2 中的所有内容之外的所有内容 我试过 [^\2] 但它仍然匹配它

正则表达式:

##[^\n]*\n## \(CR (\d)\) RM (\d): [^\n]*\n##[^\n]*\n\(CR \1\) SM \2: [^\n]*\n(##[^\n]*\n\(CL **[^\2]**\) RM \2: [^\n]*\n)+

文字:

(聊天室 1)收到客户 4 的消息:很高兴认识你!

(CR 1) RM 4:很高兴认识你!

(聊天室 1)向除客户端 4 之外的所有连接的客户端发送消息:很高兴认识你!

(CR 1) SM 4:很高兴认识你!

(客户端 1)收到客户端 4 的消息:很高兴认识你!

(CL 3) RM 4:很高兴认识你!

(客户端 1)收到客户端 4 的消息:很高兴认识你!

(CL 4) RM 4:很高兴认识你!

我希望最后两行不匹配

Demo

【问题讨论】:

  • 我已经更新了我的答案。
  • 但是你的文字中没有\或2...?
  • 哦,捕获第 2 组...

标签: regex regex-negation


【解决方案1】:

您可以使用负前瞻,然后匹配数字 (?!\2)\d 以不匹配最后一行

##[^\n]*\n## \(CR (\d)\) RM (\d): [^\n]*\n##[^\n]*\n\(CR \1\) SM \2: [^\n]*\n(##[^\n]*\n\(CL (?!\2)\d\) RM \2: [^\n]*\n)+

Regex demo

由于最后一个组是重复捕获组,如果您不需要该组本身,您也可以使其不捕获(?:

重复捕获的组只会捕获最后一次迭代的值。

(?:##[^\n]*\n\(CL (?!\2)\d\) RM \2: [^\n]*\n)+
^^^

Regex demo

【讨论】:

    【解决方案2】:

    我猜可能是类似于,

    ##[^\n]*\n## \(CR (\d)\) RM (\d): [^\n]*\n##[^\n]*\n\(CR \1\) SM \2: [^\n]*\n((?!##[^\n]*\n\(CL \2\) RM \2: [^\n]*\n)##[^\n]*\n\(CL .*?\) RM \2: [^\n]*\n)+
    

    调查一下可能没问题,但我不确定它是否接近您的想法。

    Demo

    【讨论】:

    • 正则表达式的所有其余部分都在我编写它时完美运行,因为它在我的作业的大输出文本中匹配行,但我只需要知道如何匹配除捕获中的内容之外的任何内容组
    • 对不起,这两个**来自复制这里的代码,我已经链接了一个演示以使其更容易
    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多