我有一个带有这种格式的一些行(200+)的文本:
10684 - The jackpot ? discuss Lev 3 --- ? ---
10755 - Garbage Heap ? discuss Lev 5 --- ? ---
仅当“Lev”之后的数字大于 3 时,我才想检索第一个数字(10684 或 10755)。我可以使用此正则表达式获得第一个数字:([0-9]+) -
但没有“级别”限制。
这是怎么做到的?
提前致谢。
我有一个带有这种格式的一些行(200+)的文本:
10684 - The jackpot ? discuss Lev 3 --- ? ---
10755 - Garbage Heap ? discuss Lev 5 --- ? ---
仅当“Lev”之后的数字大于 3 时,我才想检索第一个数字(10684 或 10755)。我可以使用此正则表达式获得第一个数字:([0-9]+) -
但没有“级别”限制。
这是怎么做到的?
提前致谢。
(\d+) - .*?Lev (?:[4-9]|[1-9]\d+)
第一个\d+
与您所做的一样匹配行号。
接下来.*?
是惰性量词,不会消耗太多字符。下面的表达式将引导它到正确的位置。(惰性量词通常更有效)
第二个括号 ,(?:[4-9]|[1-9]\d+)
匹配大于 3 的单个数字或不带前导零的两个数字。
好吧,stackoverflow 没有正确显示我的图像。采取这个链接:http ://regexr.com?36n5l
示例输出:
正则表达式不将数字识别为数字(仅限字符串)。你可以这样做:
([0-9]+) - .*Lev (?:[4-9][^0-9]|[1-9][0-9]+)
基本上,我们使用交替运算符 ( |
) 仅接受大于 3 的单个数字(通过检查以下字符是否不是数字来强制执行)或不以零开头的多位数字。
但是,如果该级别编号可能是行尾,您可能必须这样做:
([0-9]+) - .*Lev (?:[4-9](?:[^0-9]|$)|[1-9][0-9]+)
(我假设您使用的任何正则表达式引擎都无法处理环视断言。将来,当您询问正则表达式问题时,请尝试始终包含您使用的语言。)
啊,我刚刚读到你的编辑,这个数字总是小于 10。好吧,那就容易多了:
([0-9]+) - .*Lev [4-9]
前瞻确实是最好的,因为它只会留下数字:
/\d+(?=.*Lev (0*[4-9]|[1-9]\d))/
一些 awk 技巧:
awk -F '\? +discuss +Lev' '$2>3 { split($1,a,/ */); print a[1] }' file
在 bash 中使用这个:
var=">3"
perl -lne '/(\d+) - .*Lev (\d+)/; print $1 if $2'"$var"
这是能够通过参数传递条件的一个很好的解决方案。