![](/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.