正则表达式如何获得第n个单词的完全匹配(不使用非捕获组)

时间:2017-05-18 20:10:47

标签: regex

我正在尝试使用正则表达式返回字符串中的第n个单词。使用类似问题的其他答案,这很简单;但是,我无法访问任何代码。我只能访问正则表达式输入字段,服务器只返回完全匹配'并且不能返回任何被捕获的组,例如"组1'

编辑: 来自开发人员解释使用正则表达式的版本:

  

" ...它的javascript正则表达式因此应该与perl i兼容   相信但不是那么先进,它的水平相当低,所以并非如此   最初实施时供最终用户使用 - 我补充说   意图有一些预设的下拉菜单   转发"

/ EDIT

示例字符串:

  

一二三四五

尝试解决方案(这意味着只获取第二个单词):

^(?:\w+ ){1}(\S+)$

结果是:

  

一两个

我也尝试了正则表达式的其他变体:

(?:\w+ ){1}(\S+)$
^(?:\w+ ){1}(\S+)

但这些只是返回整个字符串。

我尝试使用regex101复制我看到的行为,但结果似乎有所不同,尤其是在更改^$时。

例如,如果我使用改变的正则表达式,我在regex101上得到相同的输出:

^(?:\w+ ){1}(\S+)

无论如何,这些比较都没有帮助我实现我的既定目标。

我希望我错过了一些基本的东西!

=== EDIT ===

感谢迄今为止所做贡献的所有人,我仍然遇到问题。我担心我不知道正则表达式的语言或限制,除了我可以通过反复试验确定的,因此这里有一个尝试和结果的列表,所有这些都试图返回"两个"来自以下样本:

  

一二三四五

\w+(?=( \w+){1}$)

返回所有单词

^(\w+ ){1}\K(\w+)

不返回任何单词(所以我假设\K不起作用)

(\w+? ){1}\K(\w+?)(?= )

根本不会返回任何文字

\w+(?=\s\w+\s\w+\s\w+$)

返回所有单词

^(?:\w+\s){1}\K\w+

返回所有单词

====

由于上述所有方法都不起作用,我想我会测试其他人看看系统的局限性

试图回复最后一句话:

 \w+$

返回所有单词

这让我相信起始^和结束$字符会发生奇怪的事情,如果省略它们,服务器可能会自动将它们放入?非常感谢任何更多的想法。

4 个答案:

答案 0 :(得分:0)

我不知道你的语言是否支持积极的外观,所以使用你的例子,

  

一二三四五

这是一个应该适用于所有语言的解决方案:

\w+匹配第一个单词

\w+$匹配最后一个单词

\w+(?=\s\w+$)匹配第4个字

\w+(?=\s\w+\s\w+$)匹配第三个字

\w+(?=\s\w+\s\w+\s\w+$)匹配第二个字

所以如果一个字符串包含10个单词:

第一个也是最后一个词很容易找到。要在某个位置查找单词,您只需使用此规则:

\w+(?=后跟\s\w+(10个位置)次,然后是$)

示例

在此字符串中:

  

一二三四五六七高十九

我想找到第6个字。

10 - 6 = 4

\w+(?=后跟\s\w+ 4次,然后是$)

我们的最终正则表达式是

\w+(?=\s\w+\s\w+\s\w+\s\w+$)

Demo

答案 1 :(得分:0)

可以使用重置匹配(\ K)来重置匹配的位置并获取字符串的第三个字,如下所示:

(\w+? ){2}\K(\w+?)(?= )

我不确定您使用的语言是什么,因此您可能有也可能无法访问此功能。

答案 2 :(得分:0)

所以,在不利方面,你不能使用后面因为它必须是一个固定的宽度模式,但是"完全匹配"只是"完全匹配"的最后一件事,所以你只需要最后一个匹配的东西。

使用正向前瞻,您可以从右侧获得第n个单词

for (int i : ii)
    i = 0;  // this only changes the value of the variable, 
            // not of the array entry (not written back)

如果您的服务器具有扩展的正则表达式,\ K可以"清除匹配的项目",但大多数正则表达式引擎都不支持此功能。

\w+(?=( \w+){n}$)

不幸的是,Regex没有标准"只匹配第n次",所以从右边算起是你能做的最好的。 (此外,Regex101在右下角有一个可搜索的快速参考,用于查找特殊字符,请记住所有正则表达式引擎都不支持这些字符)

答案 3 :(得分:0)

我不确定您的语言是否支持\K,但仍然可以分享,以防它支持:

^(?:\w+\s){3}\K\w+

获得第四个字。

  • ^代表起始锚
  • (?:\w+\s){3}是一个非捕获组,匹配三个单词(以空格结尾)
  • \K是匹配重置,因此重置匹配并且不包含先前匹配的字符
  • \w+帮助消费第n个字

Regex101 Demo

同样地,

  • ^(?:\w+\s){1}\K\w+代表第二个字
  • ^(?:\w+\s){2}\K\w+代表第3个字
  • ^(?:\w+\s){3}\K\w+代表第4个字
  • 等......