gpt4 book ai didi

C# 正则表达式匹配括号组,除非它包含指定的单词

转载 作者:行者123 更新时间:2023-12-05 03:35:06 26 4
gpt4 key购买 nike

我有一个长字符串:

(今天是蓝色的一天) (今天是美好的一天) (今天是BAD的一天) (今天是绿色的一天) (今天是蓝色的一天)

我想匹配括号组,除非它包含大写单词。该词将始终完全大写,但可能不是唯一完全大写的词 - 但将是唯一完全 BAD 的词。

我有一个很长的字符串,我想更改不包含单词 BAD 的括号组,同时保留 BAD。我希望避免遍历每个括号组来检查它是否包含 BAD。

这个:\(.+?\)

将匹配我的括号组。

我试过:

\(.+?(?=\bBAD\b).+?\) - 这匹配每个组直到包含 BAD 的组。

(?=\bBAD\b).+?\) - 这与组“BAD day)”的结尾相匹配

我尝试了一些负面回顾的变体,但无法让它们提供结果。

我知道这行得通:

\(.[^BAD]+?\)

直到你包含(今天是蓝色的一天)——然后它就失败了。

有人知道执行此操作的有效方法吗?

最佳答案

你可以使用

\((?>([^()]*\bBAD\b)?)[^()]*\)(?(1)(?!))

参见 .NET regex demo . 详细信息:

  • \( - 一个 ( 字符
  • (?>([^()]*\bBAD\b)?) - 一个原子组(当发生回溯时不允许重试其模式):除以下以外的零个或多个字符)( 然后是一个完整的单词 BAD,全部捕获到第 1 组
  • [^()]* - 除了 ()
  • 之外的零个或多个字符
  • \) - 一个 ) 字符
  • (?(1)(?!)) - 如果第 1 组匹配,则触发回溯(这里,匹配失败,因为我们之前使用了原子组)。

参见 C# demo :

var text = "(Today is a blue day) (Today is a good day) (Today is a BAD day) (Today is a green day) (Today is a blue day)";
var matches = Regex.Matches(text, @"\((?>([^()]*\bBAD\b)?)[^()]*\)(?(1)(?!))")
.Cast<Match>()
.Select(x => x.Value)
.ToList();

输出:

(Today is a blue day)
(Today is a good day)
(Today is a green day)
(Today is a blue day)

关于C# 正则表达式匹配括号组,除非它包含指定的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69975424/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com