我正在尝试使用正则表达式来匹配较大字符串中的确切数字(即人类可以理解的数字,而不是数字本身)。我要匹配的数字会有所不同。可以是整数或十进制,也可以是一位或多位数字。
x + 2 + 3
中找到2,但在2.5
,2.52
或5.2
中找不到(因为这是数字2 ,而不是实际数字2)。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
(也错误)。< / p>
我通过将表达式更改为2.x
,解决了(\bX\b(?!\.))+
的问题。这不包括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);
}
答案 0 :(得分:2)
您可以使用
private static string ReplaceNumberWithinFormula(string originalFormula, double numberToReplace, string textToReplaceNumberWith)
{
return Regex.Replace(originalFormula, $@"(?<!\d\.?){Regex.Escape(numberToReplace.ToString())}(?!\.?\d)", textToReplaceNumberWith);
}
请参见C# demo
(?<!\d\.?){Regex.Escape(numberToReplace.ToString())}(?!\.?\d)
(给定里面的变量等于2.5
,仅当
(?<!\d\.?)2\.5(?!\.?\d)
并匹配2.5
。
(?<!\d\.?)
-不带数字和可选的.
(?!\.?\d)
-后面没有可选的.
和数字。请参见regex demo。
一个更简单的正则表达式将与您只有输入的输入一起使用 可以是单词边界+基于环视的模式,例如
private static string ReplaceNumberWithinFormula(string originalFormula, double numberToReplace, string textToReplaceNumberWith)
{
return Regex.Replace(originalFormula, $@"\b(?<!\.){Regex.Escape(numberToReplace.ToString())}\b(?!\.)", textToReplaceNumberWith);
}
在这里,正则表达式看起来像\b(?<!\.)2\.5\b(?!\.)
,并且将首先匹配单词边界位置(使用\b
),然后确保在该位置之前没有.
(使用(?<!\.)
),然后将与2.5
匹配,确保在数字之后没有字符char(字母,数字或_
),然后检查是否没有{{1} }之后的数字。参见this regex demo。
它等于.
,并且比允许您在任何情况下匹配确切的浮点数或整数的最佳解决方案严格。
答案 1 :(得分:0)
答案 2 :(得分:-1)
我认为这就是您要寻找的
^\d+(\.\d+)?\b
这匹配2之类的整数
匹配十进制数字,例如2.1
与2或.3之类的模式不匹配