我有一个文本,其格式为(200+),格式为:
10684 - The jackpot ? discuss Lev 3 --- ? ---
10755 - Garbage Heap ? discuss Lev 5 --- ? ---
我只有在“Lev”之后的数字大于3时才能检索第一个数字(10684或10755)。
我可以使用此正则表达式获得第一个数字:([0-9]+) -
但没有“级别”限制。
如何做到这一点?
提前致谢。
答案 0 :(得分:3)
(\d+) - .*?Lev (?:[4-9]|[1-9]\d+)
第一个\d+
与您完成的行号匹配。
下一个.*?
是一个惰性量词,它不会消耗太多字符。以下表达式将指引它到正确的位置。 (懒惰的量词通常更有效率)
第二个括号(?:[4-9]|[1-9]\d+)
匹配大于3的单个数字或两个不带前导零的数字。
好的stackoverflow无法正确显示我的图片。点击此链接:http://regexr.com?36n5l
示例输出:
答案 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"
这是一个很好的解决方案,能够通过参数传递条件。