如何找到已经被另一场比赛捕获的比赛?

时间:2019-06-12 17:01:12

标签: c# regex

如果某些部分已经被捕获,如何替换字符串中所有匹配项:

例如给定模式“ AB | BC”和目标“ ABC”,我们匹配“ AB”,但不匹配“ BC”

我一直在尝试了解各种正则表达式分组选项(Grouping Constructs in Regular Expressions),但没有成功。我可能在吠错树。 :-(

var test = Regex.Replace("(AB)(BC)(AC)(ABC)", @"AB|BC", string.Empty);

在示例中,测试的结果为“()()(AC)(C)”,但我真正想要的是“()()(AC)()”

2 个答案:

答案 0 :(得分:2)

如果您不注意括号,则可以使用问号来替换可选字符。

用可选的AB匹配C或后跟A匹配可选的BC。在替换中,使用一个空字符串。

ABC?|A?BC

Regex demo

包括括号在内,您可以使用捕获组或环顾四周来断言左右括号是打开还是关闭括号。

(?<=\()(?:ABC?|A?BC)(?=\))

说明

  • (?<=\()断言左侧是(
  • (?:非捕获组
    • ABC?将AB与可选的C匹配 -|
    • A?BC匹配可选的A和BC
  • )关闭非捕获组
  • (?=\))断言右边是)

Regex demo

答案 1 :(得分:2)

消费重叠的伙伴,必须对其进行匹配。
因此,交替的一面必须包括其伙伴last
或第一个文字(不一定要同时使用)。

AB|BCABC?|BC = A?BC|AB