看看正则表达式。
以下将满足这种情况:
var result = Regex.Replace(originalString, @"O\(.*?\)", "");
这是什么意思:
@
- 关闭 C# 将 \ 解释为转义,否则编译器将看到我们\(
并尝试用另一个字符替换它,就像 \n 成为换行符一样(没有\(
,所以这是编译器错误)。正则表达式还使用 \ 作为转义字符,因此如果没有 @ 将斜线插入字符串以将正则表达式解释为斜线以执行正则表达式转义,则它需要双 C# 斜线,这会使正则表达式模式更加混乱
"
c#字符串的开头
O\(
文字字符O
后跟文字字符(
- 括号在正则表达式中具有特殊含义,因此反斜杠禁用特殊含义)
.*?
匹配零个或多个任意字符(懒惰/悲观)
\)
字面意思)
"
字符串结尾
.*?
是一个复杂的事情需要更多的解释:
在正则表达式.
中表示“匹配任何单个字符”,并*
表示“前一个字符的零个或多个”。这种方式.*
意味着“零个或多个任何字符”。
那是?
为了什么?
默认情况下,正则表达式*
是“贪婪的”——a.*
吃掉整个输入字符串,然后开始向后工作,将字符吐出,并检查匹配。如果您像您所说的那样连续有2个:
K(hello);O(mystring);O(otherstring);L(byebye)
然后你贪婪地匹配它,然后O\(.*\)
将匹配最初的 O(,然后消耗所有输入,然后吐出一个尾随 ) 并声明它找到匹配,所以.*
匹配mystring);O(otherstring;L(byebye
我们不想要这个。相反,我们希望它一次转发一个字符,寻找匹配的)
. 将贪婪模式更改为悲观(/懒惰)模式之后,输入被向前扫描,而不是压缩到最后并向后扫描?
。*
这意味着O\(.*?)
匹配mystring
然后稍后otherstring
,留下一个结果K(hello);;;L(byebye)
,而不是K(hello);