我想捕获而不包括字符串末尾可能存在或不存在的某种模式(括号中的任何内容)。我想捕捉除了字符串"(排除)"之外的所有内容。在以下3个例子中:
**aaaaaa**
**bbbbbb** (exclude)
**cccccc**
我尝试了以下正则表达式:
(.+)(?:\(.+\)){0,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+个空格字符串。