Java 或 Python 中的 \K 功能重复?
Posted
技术标签:
【中文标题】Java 或 Python 中的 \\K 功能重复?【英文标题】:Duplicate \K feature in Java or Python?Java 或 Python 中的 \K 功能重复? 【发布时间】:2014-06-21 15:54:55 【问题描述】:有人知道在 Java 或 Python 中复制 \K 功能的技巧吗?
假设你有这样的字符串:数字和字母的混合,然后在最后一个数字之后,一些字母。我们只想匹配这里的最后一个字母“五”。这只是解释我希望做的功能的示例。
01a01d1101five
在 php Perl Ruby 中,你可以使用 \K 来做
^[\w]*\d\K[a-z]+$
只有“五”匹配,这很好。
在 C# 中,您可以有可变宽度的后视
(?<=^[\w]*\d)[a-z]+$
只有“五”匹配,这很好。
在 Java 中这是我尝试过的。
如果我知道后面的字符串的最小和最大宽度,我可以做到
(?<=^[\w]3,9\d)[a-z]+$
只有“五”匹配。
实际上我不知道宽度,所以我对 Java 或 Python 的唯一想法是
^[\w]*\d([a-z]+$)
这匹配整个字符串并捕获 Group#1 中的“五”。所以我不知道在整个比赛/Group#0 中匹配“五”的提示。你有吗?
【问题讨论】:
除了使用捕获组之外别无他法,但是您可以使用新的 python 正则表达式模块,该模块允许可变长度的后视:pypi.python.org/pypi/regex。一种可能的方法是使用拆分方法和您想要避免的分隔符或替换方法。 Java 允许在大小有限的情况下进行可变长度后向查看:(?<=^\w0,1000\d)[a-z]+$
关于 Ruby,请注意\K
功能仅在版本 2 中出现
@CasimiretHippolyte 谢谢。是的,变量lookbehind的有限版本是我想要的Java示例bu由于某种原因我写错了,现在修复它。您的 cmets 很有帮助。
【参考方案1】:
随机想法 - 在 Java 中,您可以使用 \G
锚点并搜索全局匹配项,如下所示:
^[\w]*\d(?=[a-z]+$)|(?!^)\G[a-z]+$
第一个匹配会吃掉强制字符,第二个将是你想要的匹配,前面有正确的模式。
这意味着第一个匹配项只是在这里被丢弃(并且 Python 不支持 \G
锚点:/),但我不知道更通用的方法......我'很高兴看到一个。
【讨论】:
这个想法很有趣,我喜欢。【参考方案2】:您可以使用否定的lookbehind 来获取最后一个字母。
(?<=[0-9])[A-Za-z]+$
由于您要查找在最后一位数字和字符串末尾之间的字母,因此您不需要知道最后一位字母之前的数字字符串的长度。
如果你不需要数字出现在字符串中,你可以使用
[A-Za-z]+$
当然,在上述两种情况下,您都使用 ^$ 匹配换行选项
【讨论】:
你是对的,这适用于这个例子。但不是 \K 的一般替代品 @HansSchindler 我正在回答您帖子最后一行中关于在“全匹配”中匹配“五”的问题。我不知道 Java / Python 中 \K 的一般替代品。 是的,我喜欢并为您的回答 +1,但不能真正说出标题中问题的正确答案 谢谢,抱歉 :)以上是关于Java 或 Python 中的 \K 功能重复?的主要内容,如果未能解决你的问题,请参考以下文章