1

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

redeem: -1234
paid: 234432

那么我想匹配 -1234 和 234432

但是如果文本是

LS022-1234-5678
FA123245

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

\b\-?\d+\b

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

任何帮助表示赞赏。谢谢你。

4

3 回答 3

1

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

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

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

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

让我知道任何问题,我会尽力提供帮助。如果你想让我解释其中任何一个,也请告诉我。

编辑

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

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

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

于 2012-04-05T17:31:27.140 回答
1

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

你可以使用:

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

或者

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

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

于 2012-04-05T17:14:49.197 回答
0

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

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

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

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

请参阅正则表达式演示详情

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

请参阅C# 演示

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
于 2022-02-19T17:55:52.570 回答