如何将此表达式与正则表达式匹配?

时间:2013-10-12 05:07:35

标签: regex

我有一个文本,其格式为(200+),格式为:

10684 - The jackpot ? discuss   Lev 3    --- ? ---

10755 - Garbage Heap    ? discuss   Lev 5    --- ? ---

我只有在“Lev”之后的数字大于3时才能检索第一个数字(10684或10755)。 我可以使用此正则表达式获得第一个数字:([0-9]+) -但没有“级别”限制。

如何做到这一点?

提前致谢。

5 个答案:

答案 0 :(得分:3)

(\d+) - .*?Lev (?:[4-9]|[1-9]\d+)

第一个\d+与您完成的行号匹配。

下一个.*?是一个惰性量词,它不会消耗太多字符。以下表达式将指引它到正确的位置。 (懒惰的量词通常更有效率)

第二个括号(?:[4-9]|[1-9]\d+)匹配大于3的单个数字或两个不带前导零的数字。

好的stackoverflow无法正确显示我的图片。点击此链接:http://regexr.com?36n5l

示例输出:

enter image description here

答案 1 :(得分:1)

正则表达式不会将数字识别为数字(仅限字符串)。你可以这样做:

([0-9]+) - .*Lev (?:[4-9][^0-9]|[1-9][0-9]+)

基本上,我们使用交替运算符(|)只接受大于3的单个数字(通过检查跟随字符<<强制执行) em> not 一个数字)或一个不以零开头的多位数。

如果级别号可能是该行的结尾,您可能必须这样做:

([0-9]+) - .*Lev (?:[4-9](?:[^0-9]|$)|[1-9][0-9]+)

(我假设您正在使用的任何正则表达式引擎都无法处理外观断言。将来,当您提出正则表达式问题时,请尝试始终包含您正在使用的语言。)


啊,我刚看完你的编辑,这个数字总是小于10.那么,那就容易了:

([0-9]+) - .*Lev [4-9]

答案 2 :(得分:0)

前瞻是最好的事情,因为它只留下数字:

/\d+(?=.*Lev (0*[4-9]|[1-9]\d))/

答案 3 :(得分:0)

一些Awk技巧:

awk -F '\? +discuss +Lev' '$2>3 { split($1,a,/ */); print a[1] }' file

答案 4 :(得分:0)

在 bash 中使用这个:

var=">3"
perl -lne '/(\d+) - .*Lev (\d+)/; print $1 if $2'"$var"

这是一个很好的解决方案,能够通过参数传递条件。