正则表达式在仪表显示中匹配不同的数字

Regex matching different numbers in meter presentation

我正在尝试匹配距离表示的不同变体,这对于较大的值非常有效,但在单个数字上失败

^(?:(?<distanceMeter>\d+[,|.]?\d+?) ?\/? ?(?<distanceFemaleMeter>\d+?[,|.]?\d+?)?) ?-m ?(?<text>[\w\s]+) 比赛

但是匹配失败

我以为 d+ 总是匹配 1 个或多个数字,但它不起作用。

发帖后我发现创建一个新组可以解决这个问题,所以不用 \d+?使用 (?:\d+)?作品

^(?:(?<distanceMeter>\d+[,|.]?(?:\d+)?) ?\/? ?(?<distanceFemaleMeter>\d+?[,|.]?(?:\d+)?)?) ?-m ?(?<text>[\w\s]+) 

在您尝试的模式中,您使用 \d+? 匹配至少 1 个数字,并使其非贪婪匹配最少的数量,但仍然必须至少有一个数字。

注意使用(?:\d+)?\d*是一样的,最后使用[\w\s]+也可以只匹配whitespace 字符(也可以只匹配换行符)你可以使用 space 代替,因为在模式的其余部分你也匹配 spaces.


您的示例应全部匹配开头的数字,然后是可选的 / 和数字部分,然后是 -m 部分,后跟“文本”[=29] =]

对于该格式,您可以将整个部分设为 /,数字可选。

^(?<distanceMeter>\d+(?:[,.]\d+)?)(?: ?\/ ?(?<distanceFemaleMeter>\d+(?:[,.]\d+)?))? ?-m ?(?<text>\w+(?: \w+)*)
  • ^ 字符串开头
  • (?<distanceMeter>\d+(?:[,.]\d+)?)distanceMeter,匹配 1+ 位带可选小数部分的数字
  • (?:非捕获组
    • ?\/ ? 匹配 / 可选 spaces
    • (?<distanceFemaleMeter>\d+(?:[,.]\d+)?)distanceFemaleMeter,匹配 1+ 位带可选小数部分的数字
  • )? 关闭非捕获组并使其可选
  • ?-m ? 匹配 -m 可选 spaces
  • (?<text>\w+(?: \w+)*)text,匹配 1+ 个单词字符并可选择重复 space 和 1+ 个单词字符

看到一个regex demo.