从逗号分隔的数字列表中删除一个数字

本文关键字:数字 一个 删除 列表 分隔 | 更新日期: 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'来查看每个匹配的步骤数)。

较低回溯的原因是上面的代码没有使用遍历,这会增加一些开销。