从逗号分隔的数字列表中删除一个数字
本文关键字:数字 一个 删除 列表 分隔 | 更新日期: 2023-09-27 18:13:41
我有一个如下的数字列表:
[123,45,6,78,9]
[45]
[45,123,456]
[1234,45]
[]
[123,4,67,8,9]
假设我想删除数字45
,以尽可能少的回溯删除,我写了以下regex:
('[)((?='])|(45(?='])|45,|(?>([^,]|,(?!45(?:,|'])))))([^']'])
这个正则表达式适用于所有情况,除了最后一个情况,任何帮助将不胜感激。
使用
(?<='[)45,?|,?'b45'b
在c#: resultString = Regex.Replace(yourString, @"(?<='[)45,?|,?'b45'b", "");
在regex演示中,查看底部的替换。
- 我们匹配
45
在两种情况下,在|
交替的两侧 - 在左边,
(?<='[)
后面的视图断言前面的是[
-
45,?
匹配45和可选逗号 - 或
|
-
,?
匹配可选逗号 - 和
'b45'b
在字边界内
Regex:
(?<!'[),45'b|(?<='[)45,|(?<='[)45(?='])
替换字符串:
empty string
演示从逗号分隔的字符串中删除数字45。
c#代码应该是,
string str = @"[123,45,6,78,9]
[45]
[45,123,456]
[1234,45]
[]
[123,4,67,8,9]";
string result = Regex.Replace(str, @"(?<!'[),45'b|(?<='[)45,|(?<='[)45(?='])", "");
Console.WriteLine(result);
Console.ReadLine();
}
IDEONE
我认为@JleruOHeP会给出一个答案,但我相信他使用的是回溯最少的正则表达式,经过一点调整,使其更加无回溯:
@"'b(?:,45|45,?)'b"
对于您的测试用例,上面的步骤分别需要16、44、16和46个步骤,正如在这里的调试器中所看到的那样(您需要单击左侧窗格中的'regex debugger'来查看每个匹配的步骤数)。
较低回溯的原因是上面的代码没有使用遍历,这会增加一些开销。