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 允许在大小有限的情况下进行可变长度后向查看:(?&lt;=^\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 功能重复?的主要内容,如果未能解决你的问题,请参考以下文章

char []中的Java toString方法[重复]

函数字符串的百分比和/或格式[重复]

Python使用os.path lib获取文件名[重复]

如何不暴露python中的方法[重复]

熊猫数据框python中的解包列表[重复]

Eclipse中的重复.java文件