不要选择是否包含其他字符

时间:2018-09-24 14:24:43

标签: regex

假设我有以下数字:

  

3,000吨   300吨   44,000m   320m

我希望选择 44,000m 320m

我应该使用哪种正则表达式来仅选择末尾带有“ m”的数字(以逗号分隔),而不是那些具有“ mt”的数字?

这是我尝试过的:

\d+[,]?\d+m.

我不知道如何取消mt。

2 个答案:

答案 0 :(得分:1)

如何像下面这样的unix解决方案

> echo "3,000mt 300mt 44,000m 320m" | tr ' ' '\n' | awk -F" " ' $0~/m$/ { print } '
44,000m
320m
> 

答案 1 :(得分:1)

您非常接近解决方案,只错过了检查单词边界(由正则表达式字符\b表示)的可能性。因此,您可能只会查看该字符串是否以单词边界(例如空格或换行符或其他字符)结尾,而不是在正则表达式的末尾使用任何字符.

\d+(,\d+)?m\b

其中

  • \d+查找任何数字(至少一个数字)
  • (,\d+)?查找逗号后跟一个或多个数字(使用括号将其分组,而使用?符号则整个组是完全可选的)
  • 如上所述,
  • m\b在单词的末尾查找文字m

使用此正则表达式,您还可以匹配仅一位数字的字符串,后跟 m ,例如9m或类似名称。与您的正则表达式相比(与逗号后跟数字分组)相比,这是一个微小的变化。

我通过Python证明了正则表达式,还添加了更多的边缘情况:

>>> import re
>>> text = "3,000mt 300mt 44,000m 1m 1mt 1,3mt 320m"
>>> re.findall(r"\d+(?:,\d+)?m\b", text)  # ?: is python specific for findall method
['44,000m', '1m', '320m']