繁体   English   中英

如何替换部分未知字符串

[英]How To replace an partial unknown string


我需要替换(或更好地删除)一个我知道开头和结尾的字符串。
有些字符是未知的,字符串的长度也是未知的。
当然,我可以使用 substring 和其他 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后跟文字字符( - 括号在正则表达式中具有特殊含义,因此反斜杠禁用特殊含义)
  • .*? 匹配零个或多个任意字符(懒惰/悲观)
  • \)字面量 )
  • "字符串结尾

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

在正则表达式. 表示“匹配任何单个字符”, *表示“前一个字符的零个或多个”。 这样.*表示“零个或多个任意字符”。

那是什么? 为了?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM