如何替换部分未知字符串

How To replace an partial unknown string


我需要替换(或最好删除)一个我知道开头和结尾的字符串。
有些字符是未知的,也是字符串的长度。
当然,我可以使用子字符串和其他 c# 字符串操作,但是没有简单的替换通配符选项吗?

mystring.Replace("O(*)", "");

会是一个不错的选择。
我知道字符串以 O( 开头并以 ) 结尾。
这可能比字符串看起来像 O(something);QG(anything else)
这里的结果应该是 ;QG(anything else)

这可以通过简单的替换实现吗?
关于高级选项,他的字符串不止一次存在,如下所示:
O(something);O(someone);QG(anything else)

看看正则表达式。

以下会遇到这种情况:

var result = Regex.Replace(originalString, @"O\(.*?\)", "");

什么意思:

  • @ - 关闭 C# 将 \ 解释为转义符,否则编译器将看到我们的 \( 并尝试将其替换为另一个字符,就像 \n 成为换行符一样(并且没有 \( 所以这是一个编译器错误)。正则表达式还使用 \ 作为转义字符,因此如果没有 @ 将斜线插入字符串中,以便正则表达式解释为执行正则表达式转义的斜线,它需要双 C# 斜线,这会使正则表达式模式更加混乱
  • " c# 字符串的开始
  • O\( 文字字符 O 后跟文字字符 ( - 括号在正则表达式中有特殊含义,因此反斜杠禁用特殊含义)
  • .*? 匹配零个或多个任意字符 (lazy/pessimistic)
  • \) 文字 )
  • " 字符串结尾

.*? 是一件复杂的事情,需要更多解释:

在正则表达式中,. 表示 "match any single character",* 表示 "zero or more of the previous character"。这样 .* 就意味着 "zero or more of any character"。

那么 ? 有什么用呢?

默认情况下,正则表达式 * 是 "greedy" - 一个 .* 吃掉整个输入字符串,然后开始向后工作,吐出字符,并检查匹配项。如果你像你说的那样连续有 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);