【问题标题】:Ignoring the leading space captured in a repeated group?忽略重复组中捕获的领先空间?
【发布时间】:2021-12-30 21:33:53
【问题描述】:

以下模式匹配以 'v' 开头的行,后跟任意数量的浮点数:

    const RegexOptions options = RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.CultureInvariant;

    var regex = new Regex(@"^\s*v((?:\s+)[-+]?\b\d*\.?\d+\b)+$", options);

    const string text = @"
v +0.5 +0.5 +0.5 0.0 1.0 1.0
v +0.5 -0.5 -0.5 1.0 0.0 1.0
v -0.5 +0.5 -0.5 1.0 1.0 0.0
v -0.5 -0.5 +0.5 0.0 0.0 0.0
";

    using var reader = new StringReader(text);

    for (var s = reader.ReadLine(); s != null; s = reader.ReadLine())
    {
        if (string.IsNullOrWhiteSpace(s))
            continue;

        var match = regex.Match(s);

        if (match.Success)
        {
            foreach (Capture capture in match.Groups[1].Captures)
            {
                Console.WriteLine($"'{capture.Value}'");
            }
        }
    }

它按预期工作,只是它在数字前包含前导空格:

' +0.5'
' +0.5'
' +0.5'
' 0.0'
' 1.0'
' 1.0'
...

问题:

如何忽略每个捕获数字的前导空格?

【问题讨论】:

  • 您的文件结构是否始终有效,或者是否存在与您想要的模式不匹配的行?即,是否只是从有效文件中取出所有数字,还是您需要进行有效性检查并希望忽略无效行?
  • 不应该有错误的内容,但有自己保护总是好的。
  • 那么如果遇到像v 1.0 xy 1.0这样的行完全忽略它会怎样?
  • 是的,这是无效的,实际上它是一个 Wavefront Obj 文件。

标签: c# regex


【解决方案1】:

您可以更改正则表达式以匹配空白字符而不是捕获。

这部分 (?:\s+)\s+ 相同,当您使用 1 个或多个 whitspace 字符重复该模式时,您可以在末尾省略单词边界 \b

注意在C#中\dcan match more[0-9]

^\s*v(?:\s+([-+]?\b\d*\.?\d+))+$

C# 中的行是:

var regex = new Regex(@"^\s*v(?:\s+([-+]?\b\d*\.?\d+))+$", options);

输出

'+0.5'
'+0.5'
'+0.5'
'0.0'
'1.0'
'1.0'
'+0.5'
'-0.5'
'-0.5'
'1.0'
'0.0'
'1.0'
'-0.5'
'+0.5'
'-0.5'
'1.0'
'1.0'
'0.0'
'-0.5'
'-0.5'
'+0.5'
'0.0'
'0.0'
'0.0'

【讨论】:

  • 所以基本上在您上次编辑时,您删除了最后一个\b,因为它没用,对吗?
【解决方案2】:

您可能过于复杂了。我建议只使用以下正则表达式模式:

[+-]?\d+(?:\.\d+)?

您更新的 C# 代码:

var regex = new Regex(@"[+-]?\d+(?:\.\d+)?", options);

【讨论】:

  • 这与前面可选的正负号不匹配。
  • 我今天重感冒,头脑不是100%敏锐。
  • 别担心,休息一下,你可以恢复体形 :)
猜你喜欢
  • 2016-01-28
  • 2013-07-01
  • 2011-12-29
  • 2019-06-12
  • 2011-02-07
  • 2020-02-09
  • 2018-12-16
  • 2016-03-24
  • 1970-01-01
相关资源
最近更新 更多