我的正则表达式出了什么问题?

时间:2017-10-03 17:23:35

标签: regex linux terminal grep

这是我得到的:

grep -E '^([0-9]+[0-9]*[.]+[:blank:]+[a-zA-Z0-9]+)' text.txt

我正在尝试查找所有包含一个或多个数字后跟“。”的匹配项。 dot,atlas one space,后面跟着至少一个字符或数字。所以,一些可能的匹配将是,

1. hello
2. this works too
5. Fantastic show
12. Target

我得到了什么错。

2 个答案:

答案 0 :(得分:0)

关于有效性,有两件事:

  • [:blank:]是一个字符类。要在范围内使用它,您必须使用[ ]进行包装,如下所示:[[:blank:]]

  • 您的上一个范围表达式不包含空格,因此您只匹配第一个单词

修正,看起来像:

$ grep -E '^([0-9]+[0-9]*[.]+[[:blank:]]+[a-zA-Z0-9 ]+)' text.txt
1. hello
2. this works too
5. Fantastic show
12. Target

否则,正如其他人暗示的那样,你的表达可以简化。如果您需要坚持使用POSIX扩展正则表达式(ERE),请注意[0-9]+[0-9]*等同于[0-9]+

如果您可以启用PCRE支持(-P,仅在GNU grep中可用,被视为实验功能),则可以简化使用的字符范围。例如,您可以使用\d代替POSIX [[:digit:]](或[0-9])和\w代替[[:alnum:]](或[a-zA-Z0-9]):< / p>

$ grep -P '^\d+\.+\s+[\w ]+' text.txt

答案 1 :(得分:0)

在数字后匹配表达式中不包含空格:

[a-zA-Z0-9]+

您还可以简化表达。

  • [0-9]+[0-9]*应为[0-9]+,或更简单\d+。您的原始表达意味着“匹配一个或多个数字,然后匹配零个或多个数字”。一个或多个已处理您的预期输入。

  • [.]+ - 您是否期望超过一个时期?如果没有,您只需要[.]

鉴于此,我将你的表达改为:

^([0-9]+[.][[:blank:]]+[a-zA-Z0-9 ]+)

(感谢@randomir编辑posix [[:blank:]]