2

我创建了一个庞大的 .net 正则表达式,它可以工作,但效率很低。我不得不假设有一种更简洁的方式来编写它,但我似乎找不到。

我需要它做什么:

  • 匹配正负整数
  • 匹配小数点前面有或没有任何数字的正小数和负小数
  • 为 .NET 工作,因为它正在 WPF 应用程序中使用

来自任意示例字符串的匹配示例:

  • “7”从“7”
  • “-4”从“-4 毫米”
  • “.345”来自“.345”
  • “-.43”从“-.43 厘米”
  • "0.16" 从 "$0.16"
  • “-10.04” “-10.04”

我需要避免的:

  • 将范围内的第二个数字匹配为负数
    *例如:在“1000-3500 RPM”中匹配“-3500”(应该匹配 1000 和 3500)

我的正则表达式:

(?<![0-9])(-)\.\d+|(?<![0-9])(-)\d+\.\d+|(?<![0-9])(-)\d+|\.\d+|\d+\.\d+|\d+

故障:

?<![0-9])(-)\.\d+- 小数点前没有数字的负小数,然后确保破折号前没有数字

或者

(?<![0-9])(-)\d+\.\d+- 小数点前带有数字的负小数,然后确保破折号前没有数字

或者

?<![0-9])(-)\d+- 一个在破折号前没有数字的负整数

或者

\.\d+- 找到一个前面没有数字的正小数

或者

\d+\.\d+- 找到前面数字的正小数

或者

\d+- 找到一个正整数

现在,据我了解,这应该能够组合成更少的“或”段。我猜你至少可以结合正面和负面的情况,可能还有小数的可选数字。任何提高的性能将不胜感激。

谢谢。

4

3 回答 3

0

这个怎么样:-?(\d*\.)?\d+

于 2013-08-02T16:35:46.563 回答
0

尝试(?<!\d)\s*-?\d*(\.\d+)?

使用否定的lookbehind断言破折号之前没有数字,也只允许一个小数点(如果有的话)。

于 2013-08-02T16:44:33.303 回答
0

看起来这样可以完成工作:(?<![0-9])-?\.?([0-9]+)?\.?[0-9]+

在这里测试

编辑- 稍微浓缩:(?<![0-9])-?\.?[0-9]*\.?[0-9]+

在这里测试

于 2013-08-02T16:49:03.570 回答