2010-07-07 51 views
8

我有一个像“AAA 101 B202 C 303”的字符串,我想摆脱字符和数字之间的空格,如果有的话。 所以操作后,字符串应该像“AAA101 B202 C303”。但我不确定正则表达式是否可以做到这一点?C#中的模式匹配问题#

任何帮助?提前致谢。

回答

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 

表达可以收紧取代,但上面的应该为你的榜样输入字符串工作。

它所做的是声明一个包含字母(第一组parseheses),然后是可选空间(\ s?),然后是一组数字(\ d +)的组。这些组可以通过引用它们的索引来用于替换,所以当你想摆脱空间时,只需更换$ 1 $ 2即可。

+1

为什么使空间可选?毕竟,这就是这一切。 – 2010-07-07 16:57:52

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();