Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#正则表达式匹配精确数字(包括整数和小数) 总结_C#_Regex - Fatal编程技术网

C#正则表达式匹配精确数字(包括整数和小数) 总结

C#正则表达式匹配精确数字(包括整数和小数) 总结,c#,regex,C#,Regex,我正试图使用正则表达式在一个更大的字符串中匹配一个精确的数字(即人类理解的数字,而不是数字本身)。我想匹配的数字会有所不同。它可以是一个整数或十进制,也可以是一位数字或多位数字 例子 如果试图匹配数字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只是示例,我希望它适用于任意正数(如果它适用于负数,这不是问题,但也

我正试图使用正则表达式在一个更大的字符串中匹配一个精确的数字(即人类理解的数字,而不是数字本身)。我想匹配的数字会有所不同。它可以是一个整数或十进制,也可以是一位数字或多位数字

例子
  • 如果试图匹配数字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);
}
你可以用

private static string ReplaceNumberWithinFormula(string originalFormula, double numberToReplace, string textToReplaceNumberWith)
{
    return Regex.Replace(originalFormula, $@"(?<!\d\.?){Regex.Escape(numberToReplace.ToString())}(?!\.?\d)", textToReplaceNumberWith);
}
这里,正则表达式看起来像
\b(?),首先匹配单词边界位置(使用
\b
),然后确保位置前面没有
(使用
(?),然后匹配
2.5
,确保没有单词字符(字母、数字或
)然后将检查号码后是否没有
。请参阅


它等于
$@”(?还添加了一个负回溯:

((?<!\.)\b2\b(?!\.))+
(?

检查一下。我想这就是你要找的

^\d+(\.\d+)?\b
  • 这个匹配整数,比如2

  • 匹配十进制数,如2.1

  • 与2.或.3之类的模式不匹配


注意,您必须
Regex.Escape
编号替换
,因为它可能包含
好点,谢谢@WiktorStribiżew@Tim你尝试过我发布的解决方案了吗?你能告诉我它怎么不符合你的要求吗?@Saksham没有必要尝试,Tim不想提取/删除任何数字,Tim想o替换传递给
replacementNumberWithinformula
方法的特定数字谢谢,但我认为您误解了我试图解决的问题(如果我的解释不清楚,很抱歉,我很难清楚地表达出来!)在使用正则表达式时,我会有一个我想要匹配的特定数字,而不是试图识别字符串的哪些部分是数字。@Tim好吧,至少它不应该被否决。
^\d+(\.\d+)?\b