匹配字符串与点和没有

时间:2016-01-19 12:31:02

标签: php regex

现在我有正则表达式:

([1-9]{0,9}m - [0-9]{0,9}m)

匹配1m - 5m7m - 17m等短语

有时字符串可能是1.5m - 5m

我怎样才能匹配这些字符串呢?

2 个答案:

答案 0 :(得分:2)

您可以使用(?:\.\d+)?添加可选的小数部分:

([1-9]{0,9}(?:\.\d+)?m\h*-\h*\d{0,9}(?:\.\d+)?m)

请参阅regex demo

如果第一个号码可以是任意号码,请将[1-9]替换为\d

(?:\.\d+)?表示匹配一个文字点后跟一个或多个数字1或0(?)次

\h*匹配零个或多个水平空格。

详细说明:

  • [1-9]{0,9} - 从19范围内的0到9位数字(替换为\d以匹配任何数字
  • (?:\.\d+)? - 可选的小数部分
  • m - 文字m
  • \h* - 零个或多个水平空格
  • - - 字面连字符
  • \h* - 零个或多个水平空格
  • \d{0,9} - 任意数字,0到9次出现
  • (?:\.\d+)?m - 见上文。

如果您打算阻止在数字中匹配前导零,但接受101m - 5m之类的字符串,则可能需要使用

((?!0)\d{0,9}(?:\.\d+)?m\h*-\h*\d{0,9}(?:\.\d+)?m)
 ^^^^^

another regex demo。前瞻只会将通用\d限制为不以0开头。

答案 1 :(得分:2)

你可以试试这个。

n

  • 号码与\d+(\.\d+){0,1}m\s-\s\d+(\.\d+){0,1}m之后必须有数字。所以一起考虑。但它必须是一次或ZERO.so ...