匹配一行中的第 n 个单词

Match the nth word in a line

提问人:gsxr1300 提问时间:1/25/2019 最后编辑:Dave2egsxr1300 更新时间:3/25/2021 访问量:13123

问:

在我使用的应用程序中,我无法选择匹配组 1。

我可以使用的结果是正则表达式的完全匹配。

但我需要第 5 个单词“跳跃”作为比赛结果,而不是完整的比赛“快速的棕色狐狸跳跃”

^(?:[^ ]*\ ){4}([^ ]*)

The quick brown fox jumps over the lazy dog

这是一个链接 https://regex101.com/r/nB9yD9/6

正则表达式 查找 CPU-Word

评论

2赞 Toto 1/25/2019
您使用的是什么语言/工具?它是否支持可变长度的后视?
0赞 gsxr1300 1/25/2019
该应用程序是 ecoDMS 18.09,我知道的编程语言是 Qt 5.7,我不知道它是否支持 lookbehind,我可以尝试一下,你能给我看一个示例正则表达式吗?
0赞 Toto 1/25/2019
尝试一下 或^(?<=(?:\S+ ){4})\S+^(?:\S+ ){4}\S+
0赞 gsxr1300 1/25/2019
我试试这个“(?<=(\b\s))(\w*)”,它给了我第二个词“快”,但我怎么能得到第三个词“棕色”和“狐狸”......
1赞 Toto 1/28/2019
它与PCRE regex101.com/r/pR22LK/2 工作。您的应用程序似乎不支持它,但我不知道它是如何工作的。我认为您必须提取数组中的所有单词,然后选择所需的单词。

答:

6赞 Grismar 1/25/2019 #1

由于您需要整个匹配项仅是第 n 个单词,因此您可以尝试使用“正后视”,它允许您仅匹配某些内容,如果它前面有其他内容。

若要仅匹配第五个单词,您需要匹配前面有四个单词的第一个单词。

要匹配四个单词(即单词字符后跟空格字符):

(\w+\s){4}

匹配单个单词,但前提是它前面有另外四个单词:

(?<=(\w+\s){4})(\w+)

在此处测试结果 https://regex101.com/r/QIPEkm/1

评论

0赞 gsxr1300 1/25/2019
?前面的令牌是不可量化的,你的模式包含一个或多个错误,请看上面的解释部分。
1赞 Grismar 1/29/2019
正则表达式在 regex101、RegexBuddy 和简单的 Python 脚本中对我来说很好。我假设你改变了破坏它的东西?
1赞 gsxr1300 1/29/2019 #2

它与PCRE https://regex101.com/r/pR22LK/2 工作。您的应用程序似乎不支持它,但我不知道它是如何工作的。我认为您必须提取数组中的所有单词,然后选择所需的单词。– 多多 23小时前

您好多托,您的解决方案也可以在应用程序中使用,例如PCRE,谢谢!!– GSXR1300 刚刚编辑

2赞 Toto 1/29/2019 #3

要查找句子的第三个单词,请使用:

^(?:\w+ ){2}\K\w+

解释:

^               # beginning of line
    (?:         # start non capture group
        \w+     # 1 or more word character
                # a space
    ){2}        # group must appear twice (change {2} in {3} to get the 4th word and so on)
    \K          # forget all we have seen until this position
    \w+         # 1 or more word character

演示

0赞 luis fernando yupanqui taco 3/24/2021 #4

要匹配“第一个”四个单词(即单词字符后跟空格字符):

^(\w+\s){4}

匹配单个单词,但前提是它前面有“第一个”其他四个单词:

(?<=^(\w+\s){4})(\w+)

注意 ^ 差异

如果你想知道这个“?<=”是什么意思,请检查这个:https://stackoverflow.com/a/2973495/11280142

评论

0赞 Robert 3/24/2021
你能编辑你的答案并解释其中的区别吗?在正则表达式中有什么作用,为什么这里需要它??<=