【问题标题】:RegEx to match numbers in whole words only正则表达式仅匹配整个单词中的数字
【发布时间】:2012-04-05 17:13:12
【问题描述】:

我想使用 .NET 匹配字符串中的正数和负数(无小数或千位分隔符),但我只想匹配整个单词。 所以如果一个字符串看起来像

redeem: -1234
paid: 234432

那么我想匹配 -1234 和 234432

但如果文字是

LS022-1234-5678
FA123245

那么我不希望返回任何匹配项。我试过了

\b\-?\d+\b

但在第一种情况下它只会匹配 1234,不会返回“-”号。

感谢任何帮助。谢谢。

【问题讨论】:

    标签: .net regex


    【解决方案1】:

    好吧,我敢肯定这远非完美,但它适用于您的示例:

    (?<=\W)-?(?<!\w-)\d+
    

    如果你想在数字之前允许下划线,那么我会使用这个修改:

    (?i)(?<=[^a-z0-9])-?(?<![a-z0-9]-)\d+
    

    如有任何问题,请告诉我,我会尽力提供帮助。如果您希望我解释其中任何一个,也请告诉我。

    编辑

    仅在数字/负号之前有空格或制表符时才匹配(如下面的评论中所述),可以使用:

    (?<=[ \t])-?\d+
    

    请注意,它将匹配例如在电话号码、时间或日期值的第一个数字系列上,如果数字位于行首(换行符之后),则将不匹配 - 确保这是您想要的:D

    【讨论】:

    • 你是最有帮助的,谢谢。这要好得多。但是,我未能正确定义任务:仅当正数或负数前面有空格或 TAB 字符时才需要匹配(我不希望匹配中包含空格或制表符)。
    【解决方案2】:

    空格和-之间没有单词边界,因此你不能在那里使用\b

    你可以使用:

    (?<!\S)-?\d+\b
    

    (?<![\w-])-?\d+\b
    

    取决于您的要求(未完全指定)。 两者都适用于您的示例。

    【讨论】:

    • 似乎仍然匹配他不想匹配的情况......(?)它不匹配负数的数字,但它匹配数字,因为连字符是'不是单词字符'
    • 代码骑师:你是对的。我也需要匹配“-”。此外,提供的 RegEx 也匹配了很多“垃圾”(意思是非完整的词)。
    【解决方案3】:

    \b-?\d+\b 模式是错误的,因为\b 在可选的-? 模式之前需要一个字符字符紧邻连字符的左侧。一般来说,不要在可选模式旁边使用单词边界(除非您当然知道自己在做什么)。

    您可以使用-?\b\d+\b 来匹配 123-123 就像数字作为整个单词。但是,在这里,您正在寻找一些不同的东西,因为 12345678LS022-1234-5678 中的整个单词,因为它们用非单词字符(即连字符)括起来。

    在这种情况下,您需要扩展匹配 \b 的整个单词,并在左侧进行额外的后向检查:

    -?\b(?<!\d-)\d+\b
    

    请参阅regex demo详情

    • -? - 一个可选的连字符
    • \b - 单词边界
    • (?&lt;!\d-) - 如果在当前位置的左侧有一个数字 + -,则匹配失败。
    • \d+ - 一位或多位数字
    • \b - 单词边界。

    C# demo

    using System;
    using System.Linq;
    using System.Text.RegularExpressions;
    
    public class Test
    {
        public static void Main()
        {
            var text = "LS022-1234-5678, FA123245, redeem: -1234, paid: 234432";
            var matches = Regex.Matches(text, @"-?\b(?<!\d-)\d+\b").Cast<Match>().Select(x => x.Value).ToList();
            foreach (var s in matches)
                Console.WriteLine(s);
        }
    }
    

    输出:

    -1234
    234432
    

    【讨论】:

      猜你喜欢
      • 2017-07-08
      • 1970-01-01
      • 2010-11-15
      • 2012-01-06
      相关资源
      最近更新 更多