1


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

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

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

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

4

1 回答 1

6

看看正则表达式。

以下将满足这种情况:

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);

于 2019-10-31T10:06:05.593 回答