如何使用正则表达式匹配包含特定单词的行中的第N个单词

10

我正在尝试获取正确的正则表达式,以匹配包含特定单词的一行中的第N个单词。

例如,如果我的输入是:

this is the first line - blue
this is the second line - green
this is the third line - red

我想匹配包含单词“second”的行中的第七个单词,并返回green

我正在使用Rubular测试正则表达式。

我已经尝试过这个正则表达式,但没有成功 - 它匹配了下一行:

```regex ^.*second(?:\W+(\w+)){6}\W+(\w+) ```
(.*second.*)(?<data>.*?\s){7}(.*)

另一个示例输入:

this is the Foo line - blue
this is the Bar line - green
this is the Test line - red

我想匹配包含单词 "red" 的行中的第四个单词,然后返回 Test

我要匹配的单词可以出现在我用来选择行的单词之前或之后。

2个回答

14
您可以使用此方法来匹配包含second的行,并获取第7个单词:
^(?=.*\bsecond\b)(?:\S+ ){6}(\S+)
确保全局和多行标志处于活动状态。 ^ 匹配一行的开头。 (?=.*\bsecond\b) 是一个正向预查,用于确保该特定行中有单词 second(?:\S+ ){6} 匹配 6 个单词。 (\S+) 将获取第七个。 regex101 演示
您可以使用相同的原则来满足其他要求。
例如,对于包含单词 red 的行并获取第四个单词...
^(?=.*\bred\b)(?:\S+ ){3}(\S+)

他只想匹配包含“second”的行中的第7个单词,而“second”本身是该行上的一个单词。 - Palpatim
@Jerry 谢谢,但这并没有解决我的问题 - 我需要包含单词“second”的那一行,而不是第二行。 - Jorge
1
+1,但重要的是注意正则表达式上的“m”标志。 - Palpatim
@Palpatim 谢谢,我把那里弄乱了 >~< - Jerry
我喜欢新答案胜过旧答案。 - Floris
1
@Floris 我也是。当我读错了什么并意识到为时已晚时,我会讨厌自己 :( - Jerry

3

你要求正则表达式,已经得到了一个很好的答案。

有时候你需要寻求解决方案,而不是指定工具。

以下是我认为最适合你需求的一行代码:

awk '/second/ {print $7}' < inputFile.txt

说明:

/second/     - for any line that matches this regex (in this case, literal 'second')
print $7     - print the 7th field (by default, fields are separated by space)

我认为这种处理方式比正则表达式更易理解,而且更加灵活。


请求工具意味着提问者已经决定了解决方案,这就是我们所说的 XY 问题。"什么是 XY 问题?"讨论了这种情况。通常,他们预先确定的任何解决方案都是错误的。 - the Tin Man
@theTinMan 完全同意你的观点! - Floris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接