如何替换部分未知字符串
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);
我需要替换(或最好删除)一个我知道开头和结尾的字符串。
有些字符是未知的,也是字符串的长度。
当然,我可以使用子字符串和其他 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);