我正在尝试使用正则表达式返回字符串中的第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+$
返回所有单词
这让我相信起始^
和结束$
字符会发生奇怪的事情,如果省略它们,服务器可能会自动将它们放入?非常感谢任何更多的想法。
答案 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+$)
答案 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个字同样地,
^(?:\w+\s){1}\K\w+
代表第二个字^(?:\w+\s){2}\K\w+
代表第3个字^(?:\w+\s){3}\K\w+
代表第4个字