![](/img/trans.png)
[英]Regex expression - match specific characters (multiple times) and ignore comments
[英]Regex match but ignore specific characters in the output
我需要一個正則表達式PATTERN
(在C#中使用),它將使用 3位逗號分隔符來匹配整數值,但不會在結果匹配值中返回逗號。 例如,我需要將下面的代碼寫1
, 1234
和1234567
控制台:
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;
}
}
}
好的,這是一個hack,但是它可以讓您在聲明表達式中以聲明性和可重用的方式保持邏輯。
現在,您發布的完整正則表達式在被黑的版本中看起來像這樣:
(?<concat>[-+])?(?<concat>[0-9]+)(?:,(?<concat>[0-9]{3}))*(?<concat>[eE][-+]?[0-9]+)?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.