如何在捕获组中不匹配字符

时间:2019-10-13 14:20:26

标签: regex regex-negation

我有一个编号为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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我想也许是类似的表情

##[^\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