【发布时间】:2019-03-28 10:37:33
【问题描述】:
总结
我正在尝试使用正则表达式来匹配较大字符串中的确切数字(即人类可以理解的数字,而不是数字本身)。我尝试匹配的数字会有所不同。可以是整数,也可以是小数,也可以是一位数,也可以是多位数。
示例
- 如果尝试匹配数字 2,我希望它在
x + 2 + 3中找到 2,但不在2.5、2.52或5.2中找到 2(因为那是数字 2,而不是实际数字 2)。 - 如果尝试匹配数字 2.5,我希望它在
x + 2.5 + 3和2.5中找到 2.5,但不是2.52或12.5。
请注意,2 和 2.5 只是示例,我希望它适用于任意正数(如果它适用于负数,这不是问题,但也不是必需的)。
初步尝试
我从 (\bX\b)+ 开始(其中 X 将是我要匹配的数字),当 X 为 2.5 时有效,但当 X 为 2 时无效。这是因为它使用分词符来识别数字,但小数点算作分词。这意味着如果 X 为 2(即正则表达式为 (\b2\b)+),它将匹配数字 2(正确),但也匹配 2.x(不正确)和 x.2(也不正确)。
当前尝试
我通过将表达式更改为(\bX\b(?!\.))+ 解决了2.x 的问题。这不包括 X 后跟小数点的数字,因此如果 X 为 2,它将匹配 2(正确),将不匹配 2.x(正确)但仍将匹配 x.2(不正确)。如果 X 是十进制数,则它可以正常工作(因此,如果 X 为 2.5,它将正确匹配 2.5 并排除 12.5 或 2.51)。
如果 X 前面有小数点,如何避免匹配?
实际用例
如果有帮助,最终目标是将其与 C# Regex.Replace 函数一起使用,如下所示:
private static string ReplaceNumberWithinFormula(string originalFormula, double numberToReplace, string textToReplaceNumberWith)
{
return Regex.Replace(originalFormula, $@"(\b{numberToReplace}\b(?!\.))+", textToReplaceNumberWith);
}
【问题讨论】:
-
请注意,您必须
Regex.EscapenumberToReplace因为它可能包含. -
好地方,谢谢@WiktorStribiżew
-
@Tim 你尝试过我发布的解决方案吗?你能告诉我它为什么不符合你的要求吗?
-
@Saksham 没有必要尝试,Tim 不想提取/删除 任何 个数字,Tim 想替换传递的 特定 个数字到
ReplaceNumberWithinFormula方法