0

我有一个带有这种格式的一些行(200+)的文本:

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

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

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

这是怎么做到的?

提前致谢。

4

5 回答 5

3

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

第一个\d+与您所做的一样匹配行号。

接下来.*?是惰性量词,不会消耗太多字符。下面的表达式将引导它到正确的位置。(惰性量词通常更有效)

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

好吧,stackoverflow 没有正确显示我的图像。采取这个链接:http ://regexr.com?36n5l

示例输出:

在此处输入图像描述

于 2013-10-12T05:24:48.200 回答
1

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

([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]
于 2013-10-12T05:15:54.150 回答
0

前瞻确实是最好的,因为它只会留下数字:

/\d+(?=.*Lev (0*[4-9]|[1-9]\d))/
于 2013-10-12T11:08:46.523 回答
0

一些 awk 技巧:

awk -F '\? +discuss +Lev' '$2>3 { split($1,a,/ */); print a[1] }' file
于 2013-10-12T15:58:38.917 回答
0

在 bash 中使用这个:

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

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

于 2021-01-21T15:23:41.760 回答