正则表达式中+和*的含义是什么?

时间:2009-03-30 23:01:56

标签: regex

我在这里得到了一个问题的答案:How do I know if a file is tab or space delimited in Perl?

但是如果有人可以分解正则表达式并解释发生了什么以及为什么它不能在文件的最后一行上工作,那真的会对我有所帮助。

~/^(\d+\s+)+?$/

我认为上面的'+'在后面所以如果我添加'*'它会起作用,因为*表示零或更多......但是这不起作用

2 个答案:

答案 0 :(得分:3)

Regex: /^(\d+\s+)+?$/
Parts:  1  2  3  456
  1. 从一行开始匹配
  2. 查找一个或多个号码
  3. 后跟一个或多个空格(或标签)
  4. 查找 2 3
  5. 中的一项或多项
  6. 但是不要在那场比赛中贪婪(也就是说,你可以停下来,直到你不能继续前进)
  7. 匹配一行的结尾。
  8. 它应匹配整行空格或制表符分隔数字的字符串。我不确定为什么它会在最后一行失败..也许最后没有空格?由于每个数字后面必须至少有一个空格,可能就是它。

答案 1 :(得分:0)

实际上原始的正则表达式不接受空行,这可能就是为什么它不能在文件的最后一行上工作(指向示例文件的链接会很好)。它应该是这样的:

perl -ne 'if ($_=~/^(\d+\s+)*$/){print "yep\n";}'

另一种方法可能是检查所有字符是空格还是数字。

接受空行时:

perl -ne 'if ($_=~/^[\s\d]*$/){print "yep\n";}'

不接受空行时:

perl -ne 'if ($_=~/^[\s\d]+$/){print "yep\n";}'