簡體   English   中英

正則表達式匹配,但忽略輸出中的特定字符

[英]Regex match but ignore specific characters in the output

我需要一個正則表達式PATTERN (在C#中使用),它將使用 3位逗號分隔符來匹配整數值,但不會在結果匹配值中返回逗號。 例如,我需要將下面的代碼寫112341234567控制台:

string text = "This 1 is 1,234 a 1,234,567 sentence 7,654.321.";
// NOTE: value "7,654.321" would preferably NOT match, 
//       but it is acceptable for now if it does
MatchCollection matches = Regex.Matches(text, PATTERN);
foreach (Match match in matches)
    Console.Write(match.Value + " ");

不能Regex.Matches ,然后做一個String.Replace刪除逗號; 這一切都必須在regex PATTERN發生(因為我的所有regex表達式都是從數據庫中提取的,並且如果沒有大量的意大利面條代碼,就無法在模式本身之外包含邏輯)。 如前所述,我寧願不匹配理性值,但是一旦我使逗號排除起作用,那應該很容易解決。

以下模式不起作用 ,但它可能與我所需要的非常接近:

// THIS PATTEN DOES NOT WORK!!!
//    but is probably close to what I need
string PATTERN = @"([\+-]?[0-9]+[(?<=,)[0,9]{3}]*)([eE][\+]?[0-9]+)?"

如果從上方刪除[(?<=,)[0,9]{3}]* ,則具有標准的整數模式。 再一次,我需要接受整數中的逗號,但不將其作為匹配的一部分返回。 我應該如何改變這種模式?

正則表達式匹配項輸入字符串的整個子字符串。 它不能是一組子字符串-它必須是一個子字符串。

同樣,捕獲組只能捕獲子字符串,因此您也不能對此做太多事情。

但是,由於您使用的是.NET,因此如果可以負擔得起添加一些通用代碼,則可以利用捕獲堆棧嘗試進行真正的丑陋破解。

首先,正則表達式。 它被簡化到最小程度,以便於理解:

(?:(?<concat>\d+),?)+

下面提供了正則表達式的完整版本,但現在我們將繼續使用它。

然后,您可以在代碼中實現以下邏輯:

  • 如果正則表達式不包含名為concat的組,則照常進行處理
  • 如果是這樣,請執行以下操作而不是獲取整個匹配項:
    • 提取該組的所有捕獲: match.Groups["concat"].Captures
    • 抓住他們的價值
    • 然后使用該值

這將類似於以下內容:

public static IEnumerable<string> GetValues(string input)
{
    // Suppose regex could be any regex
    var regex = new Regex(@"(?:(?<concat>\d+),?)+");

    foreach (Match match in regex.Matches(input))
    {
        // Does this regex have our special feature?
        if (regex.GroupNumberFromName("concat") >= 0)
        {
            // Concat the captured values
            var captures = match.Groups["concat"].Captures.Cast<Capture>().Select(c => c.Value).ToArray();
            yield return String.Concat(captures);
        }
        else
        {
            // This is a normal regex
            yield return match.Value;   
        }
    }
}

Ideone演示

好的,這是一個hack,但是它可以讓您在聲明表達式中以聲明性和可重用的方式保持邏輯。

現在,您發布的完整正則表達式在被黑的版本中看起來像這樣:

(?<concat>[-+])?(?<concat>[0-9]+)(?:,(?<concat>[0-9]{3}))*(?<concat>[eE][-+]?[0-9]+)?

演示

暫無
暫無

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

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