如何使用正则表达式删除最终可能存在或不存在的模式

时间:2018-02-15 10:35:20

标签: c# regex

我想捕获而不包括字符串末尾可能存在或不存在的某种模式(括号中的任何内容)。我想捕捉除了字符串"(排除)"之外的所有内容。在以下3个例子中:

**aaaaaa**

**bbbbbb** (exclude)

**cccccc** 

我尝试了以下正则表达式:

(.+)(?:\(.+\)){0,1}

1 个答案:

答案 0 :(得分:0)

您可以使用匹配的方法

^(.+?)(?:\(.*\))?$

请参阅regex demo。基本上,您需要为模板添加锚点,并使用第一个点匹配模式的惰性量词。

<强>详情

  • ^ - 字符串的开头
  • (.+?) - 第1组:除了换行符之外的一个或多个字符很少*?允许正则表达式引擎首先测试下一个可选子模式,并且仅在不匹配的情况下展开这个)
  • (?:\(.*\))? - 可选序列
    • \( - (字符
    • .* - 除了换行符之外的任何0 +字符
    • \) - )字符
  • $ - 字符串结束。

在C#中:

var m = Regex.Match(s, @"^(.+?)(?:\(.*\))?$");
var result = string.Empty;
if (m.Success) {
    result = m.Groups[1].Value;
}

如果使用

内部没有其他括号,您也可以删除字符串末尾括号中的子字符串。
var res = Regex.Replace(s, @"\s*\([^()]*\)\s*$", "");

another demo。在这里,\s*\([^()]*\)\s*$匹配0 +空格,(,除()之外的任何0 +字符([^()]*),最后匹配0+个空格字符串。