【问题标题】:C# regex formulaC# 正则表达式
【发布时间】:2015-05-29 08:01:08
【问题描述】:

对于以下行,我需要一个正则表达式来获取双引号之外的值,即:0.0100.5

"VAL_ 344 PedalPos 0.0 \"% (0.0 ... 100.0)\" 100.5 \"Invalid - Undefined (100.5 ... 127.5)\";"

使用这条规则Regex.Match(line, "\"\\s[0-9]+\\s\""),我得到一个组,这是第一个值:0.0。我不知道如何扩展搜索以包含以下所有值。

考虑到这部分[0-9],我认为这仅适用于整数值,我在那里添加了一个点[0-9.],这包括整个双数。这是正确的方法吗?

【问题讨论】:

  • 看来你也想解压344吧?
  • @stribizhev,不..那个值是一个 ID。它不应该被添加。
  • ID 的标准是什么?总是在VAL_ 之后?请澄清。
  • \s?\d+(\.\d{1,2}) 这应该可以工作,在这里测试...regexpal.com
  • 在您的情况下,以下正则表达式将起作用:([\d\.]+)\s+\\" 字符转义后:([\\d\\.]+)\\s+\\\\" 您将获得两个捕获的组,您可以通过索引访问它们。我在regexr.com 上查过了

标签: c# regex


【解决方案1】:

我建议以下方法:

1) 删除所有带引号的字符串,

2) 提取所有前面没有VAL_ 的数字。

var txt = "VAL_ 344 PedalPos 0.0 \"% (0.0 ... 100.0)\" 100.5 \"Invalid - Undefined (100.5 ... 127.5)\";";
txt = Regex.Replace(txt, @"""[^""]*""", string.Empty);
var results = Regex.Matches(txt, @"(?<!VAL_\s+)-?\b\d*\.?\d+\b");

输出:

正则表达式解释:

  • "[^"]*" - 匹配带引号的字符串
  • (?&lt;!VAL_\s+)\b\d*\.?\d+\b:
    • (?&lt;!VAL_\s+) - 检查数字是否前面没有常量 VAL_ 字符串和 1 个或多个空格
    • \b\d*\.?\d+\b - 匹配一个浮点数的整个单词(有点简化,但它甚至可以与 .04 类似的值一起使用)。

【讨论】:

  • 我希望我的解释是好的。而且这个问题绝不是重复的。
  • @Rawling:否决有效答案是不好的。我在发布之前测试我的答案。你不喜欢这个问题吗?否决问题。
  • 很抱歉在 cmets 中提到了一些重要的细节。事实上,我没有给予足够的关注,我只是专注于我的价值观,错过了 VAL_ 之后的第一个整数。但是这个答案给出了预期的结果,我感谢 stribizhev 两次,一次是因为它的公式,一次是因为他关于 344 值的问题。
  • 迟到的问题:我也找不到获得负值的方法。在这种情况下 -100.5。
  • 我通过在正则表达式中添加一个可选的减号来添加对负值的支持:@"(?&lt;!VAL_\s+)-?\b\d*\.?\d+\b"
【解决方案2】:

尝试"\s(\d+\.?\d*)\s"(代码中的string regex = "\"\\s(\\d+\\.?\\d*)\\s\"";)并获取第一组的结果。

【讨论】:

    【解决方案3】:

    根据我的理解,一种更通用的方法,使用单个表达式来获取您需要的数字:

    @"VAL_\s*\d+|""[^""]+""|(\d+(?:\.\d+)?)"
    

    工作原理是它实际上首先匹配您不想要的部分而不做太多事情,当涉及到最后一部分时,它使用捕获组来获取您实际需要的内容。这是一个关于如何使用它的sn-p:

    string text = "VAL_ 344 PedalPos 0.0 \"% (0.0 ... 100.0)\" 100.5 \"Invalid - Undefined (100.5 ... 127.5)\";";
    var re = new Regex(@"VAL_\s*\d+|""[^""]+""|(\d+(?:\.\d+)?)", RegexOptions.IgnoreCase);
    var textmatches = re.Matches(text);
    Console.WriteLine("Result:");
    foreach (Match match in textmatches)
    {
        Console.WriteLine(match.Groups[1].Value);
    }
    

    ideone demo

    VAL_\s*\d+ 匹配 VAL_,后跟可选的空格和数字作为 ID,

    ""[^""]+"" 全部用双引号括起来,

    (\d+(?:\.\d+)?) 最后得到数字。我使用的是基本的,所以如果你有更复杂的数字(负数、科学格式等),你必须相应地改变它。

    【讨论】:

    • 这应该比使用两个正则表达式更有效,即使括号之间的内容包含两个以上用空格分隔的数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多