替换除数字外的所有字符的正则表达式

15
如果我有一个包含数字的字符串。这种模式不是一致的。我想从字符串中提取所有数字,只保留一个被定义为允许的字符。我认为正则表达式可能是最简单的方法。你能提供一个正则表达式模式吗?因为我认为正则表达式就像巫术,只有专家才知道它的工作原理。
例如/
"Q1W2EE3R45T" = "12345"
"WWED456J" = "456"
"ABC123" = "123"
"N123" = "N123" //N is an allowed character

更新:这是我的代码:

var data = Value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
data = data.Select(x => Regex.Replace(x, "??????", String.Empty)).ToArray();

字符串很长吗?for循环不是一个选项吗? - gbianchi
"正则表达式看起来像巫术,只有正则医生才知道它是如何工作的"。这并不正确!一旦你仔细地思考它,逐个部分地理解,它就会变得非常合理。 - Katriel
@katrielalex 我确实理解短的,但长的就有点棘手了! - Jon
3个回答

23

糟糕!刚刚意识到我需要允许字符“N”。 - Jon
@Jon:更新了我的答案,以允许使用“N”。 - Brad Christie

4

无需使用正则表达式!只需查看字符并询问它们是否为数字。

s.Where(Char.IsDigit)

或者如果您需要它作为字符串。
new String(s.Where(Char.IsDigit).ToArray())

编辑:显然您还需要使用'N'

new String(s.Where(c => Char.IsDigit(c) || c == 'N').ToArray())

编辑示例:

var data = Value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
data = data.Select(s => 
    new String(s.Where(c => Char.IsDigit || c == 'N').ToArray())
).ToArray();

这真的很糟糕,嵌套lambda语句,因此更好的选择是使用正则表达式以获得更清晰的代码。


你能否使用我的LINQ来展示你的答案,因为IsDigit只会检查字符串中的一个字符? - Jon
@Jon 什么?我不明白你的句子。 - Katriel
你能否使用我提出问题中的代码,展示一下你的答案如何适用于其中? - Jon
@Jon完成。为了代码清晰度,你最好使用正则表达式。 - Katriel

1

可以考虑类似这样的内容:

String s = "";
for ( int i = 0; i < myString.length; ){
    if ( Char.IsDigit( myString, i ) ){ s += myString.Chars[i]; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接