C#中的模式匹配问题

8
我有一个字符串,如“AAA 101 B202 C 303”,我想要去掉字符和数字之间的空格。因此,在操作后,该字符串应该像“AAA101 B202 C303”。但我不确定是否可以使用正则表达式来实现这个目标?
有帮助吗?提前致谢。
4个回答

8

是的,你可以使用正则表达式来实现这个功能。以下是一个简短但完整的示例:

using System;
using System.Text.RegularExpressions;

class Test
{
    static void Main()
    {
        string text = "A 101 B202 C 303 ";
        string output = Regex.Replace(text, @"(\p{L}) (\d)", @"$1$2");
        Console.WriteLine(output); // Prints A101 B202 C303
    }
}

(如果您要经常这样做,您可能需要为该模式编译一个正则表达式。)

\p{L}匹配任何Unicode字母-您可能希望更加严格。


1

您可以这样做

([A-Z]+)\s?(\d+)

翻译成中文:

并替换为

$1$2

表达式可以更加简洁,但是上面的代码应该适用于你的示例输入字符串。

它声明了一个包含字母的组(第一组括号),然后是一个可选的空格(\s?),然后是一组数字(\d+)。这些组可以通过引用它们的索引在替换中使用,所以当你想要去掉空格时,只需用$1$2进行替换即可。


1
为什么要使空格可选呢?毕竟,这就是所有的关键。 - Tim Pietzcker

0

虽然不如正则表达式简洁,但像这样的C#代码非常直观且运行速度非常快:

StringBuilder sb = new StringBuilder();
for(int i=0; i<s.Length; i++)
{
    // exclude spaces preceeded by a letter and succeeded by a number
    if(!(s[i] == ' '
        && i-1 >= 0 && IsLetter(s[i-1])
        && i+1 < s.Length && IsNumber(s[i+1])))
    {
        sb.Append(s[i]);
    }
}
return sb.ToString();

0

只是为了好玩(因为编程有时应该是有趣的):o) 我正在使用 LINQAggregate

 var result = text.Aggregate(
 string.Empty,
 (acc, c) => char.IsLetter(acc.LastOrDefault()) && Char.IsDigit(c) ?
 acc + c.ToString() : acc + (char.IsWhiteSpace(c) && char.IsLetter(acc.LastOrDefault()) ?
 string.Empty : c.ToString())).TrimEnd();

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