簡體   English   中英

C#中的模式匹配問題

[英]Pattern matching problem in C#

我有一個像“AAA 101 B202 C 303”這樣的字符串,我想擺脫字符和數字之間的空格,如果有的話。 所以操作后,字符串應該像“AAA101 B202 C303”。 但我不確定正則表達式是否可以做到這一點?

有幫助嗎? 提前致謝。

是的,您可以使用正則表達式執行此操作。 這是一個簡短而完整的例子:

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字母 - 您可能希望限制更多。

你可以做點什么

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

並替換為

$1$2

表達式可以收緊,但上面的內容應該適用於您的示例輸入字符串。

它的作用是聲明一個包含字母(第一組parantheses)的組,然后是一個可選空格(\\ s?),然后是一組數字(\\ d +)。 這些組可以通過引用它們的索引來替換它們,所以當你想要擺脫空間時,只需用$ 1 $ 2替換。

雖然不像Regex那樣簡潔,但像這樣的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();

只是為了好玩(因為編程的行為有時候應該很有趣):o)我正在使用LINQ with Aggregate

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM