我想使用 .NET 匹配字符串中的正数和负数(无小数或千位分隔符),但我只想匹配整个单词。所以如果一个字符串看起来像
redeem: -1234
paid: 234432
那么我想匹配 -1234 和 234432
但是如果文本是
LS022-1234-5678
FA123245
那么我不想返回任何匹配项。我试过了
\b\-?\d+\b
但它只会在第一种情况下匹配 1234,而不返回“-”符号。
任何帮助表示赞赏。谢谢你。
好吧,我敢肯定这远非完美,但它适用于您的示例:
(?<=\W)-?(?<!\w-)\d+
如果你想在数字之前允许下划线,那么我会使用这个修改:
(?i)(?<=[^a-z0-9])-?(?<![a-z0-9]-)\d+
让我知道任何问题,我会尽力提供帮助。如果你想让我解释其中任何一个,也请告诉我。
编辑
仅在数字/负号之前有空格或制表符时才匹配(如下面的评论中所述),可以使用:
(?<=[ \t])-?\d+
请注意,它将匹配例如电话号码、时间或日期值的第一个数字系列,并且如果数字位于行首(换行符之后)则不匹配- 确保这是您想要的:D
空格 和 之间没有单词边界-
,因此您不能\b
在那里使用。
你可以使用:
(?<!\S)-?\d+\b
或者
(?<![\w-])-?\d+\b
取决于您的要求(未完全指定)。两者都适用于您的示例。
该\b-?\d+\b
模式是错误的,因为\b
在可选-?
模式之前需要一个单词 char 立即出现在连字符的左侧。通常,不要在可选模式旁边使用单词边界(除非您当然知道自己在做什么)。
您可以使用-?\b\d+\b
来匹配 123
或-123
喜欢数字作为整个单词。但是,在这里,您正在寻找一些不同的东西,因为1234
and5678
是里面的整个单词,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