在任何编程语言中,我都知道如何有效地限制给定文件或字符串中的行数,这不是问题所在。但是在这种情况下,我希望通过正则表达式来做到这一点。在此模式中,我仅使用\n
换行符。我不需要其他内容,例如\r
回车。
(?:(?:\n)?[^\n]*){0,3}
上面的正则表达式解释了:
(?: group, but do not capture (between 0 and 3 times)-
(?: group, but do not capture (optional)
\n '\n' (newline)
)? end of grouping
[^\n]* any character except: '\n' (newline) (0 or more times)
){0,3} end of grouping
现在在字符串中使用此正则表达式,例如..
In this line is foo bar and baz
In this line is bar and foo
In this line is baz and bar
In this line we have foo
In this line we have bar and foo and baz
In this line we have foobar
In this line we have foo
In this line we have foo and bar
In this line we have bar and baz and foo
这将返回行1-3
没有问题。
在上面的字符串中,行7
,8
和9
都包含单词foo
,无论它是在开头,中间还是字符串的结尾。
现在我的问题是我如何实现前瞻或后面搜索字符串并查找一行中3
行文本,这些文本行本身都具有相同的关键字foo
而不是作为单词的前缀还是组合成另一个单词?因此,它只匹配行7-9
而不匹配1-6
。
答案 0 :(得分:4)
我不明白为什么这需要任何lookaround。只匹配包含foo
的行:
(?:\n?[^\n]*foo[^\n]*){3}
请注意,使用可选的\n
,这可能与包含foo
三次的行匹配。为避免这种情况,请使用
(?:(?:^|\n)[^\n]*foo[^\n]*){3}
// or
(?:[^\n]*foo[^\n]*(?:\n|$)){3}
(取决于您的正则表达式风格,您可能会对字符串开头/结尾使用不同的anchors)
如果您需要foo
站在自己的位置,只需添加word boundaries即可:
(?:\n?[^\n]*\bfoo\b[^\n]*){3}