2014-05-05 54 views
2

有人知道提示在Java或Python中複製\ K功能嗎?在Java或Python中複製 K功能?

假設你有這樣的字符串:數字和字母的混合,然後在最後一個數字之後,一些字母。我們只想匹配這裏的最後幾個字母「五」。這只是解釋我希望做的功能的例子。

01a01d1101five 

在PHP Perl的紅寶石你\ K優可以做

^[\w]*\d\K[a-z]+$ 

僅 「十一五」 匹配這是偉大的。

在C#中,你可以有可變寬度的回顧後

(?<=^[\w]*\d)[a-z]+$ 

僅「十一五」匹配這是偉大的。

在Java中,這是我試過的。

如果我知道分鐘和字符串的最大寬度後面我可以做

(?<=^[\w]{3,9}\d)[a-z]+$ 

,僅「十一五」匹配。

其實我也不知道寬度,使我對Java或Python唯一的想法是

^[\w]*\d([a-z]+$) 

這整個字符串匹配和組#1捕捉「十二五」。所以我不知道在整場比賽/小組#0中與「五」匹配的提示。你是否有一個?

+1

除了使用捕獲組,沒有別的辦法,但是你可以使用新的Python正則表達式模塊,它允許可變長度的向後看:https://pypi.python.org/pypi/regex。一種可能的方法是使用拆分方法,以避免使用分隔符或替換方法。 –

+0

如果大小有限,Java允許變長lookbehind:'(?<=^\ w {0,1000} \ d)[az] + $' –

+0

關於Ruby,請注意'\ K'功能只出現在版本2 –

回答

1

隨想 - 在Java中,你可以使用\G錨和搜索,像這樣全球性的比賽:

^[\w]*\d(?=[a-z]+$)|(?!^)\G[a-z]+$ 

的第一場比賽將吃掉強制字符,第二個是你想之前的比賽通過正確的模式。

這意味着第一場比賽只能在這裏被扔掉(並且Python不支持\G anchor:/),但我不知道更通用的方式來做到這一點...我會很高興看到一個。

+0

這是一個有趣的想法,我喜歡它。 –

1

您可以使用負面的後代來獲取最後的字母。

(?<=[0-9])[A-Za-z]+$ 

既然你正在尋找的最後一個數字和字符串的結尾之間的信件,你不需要知道最後一個字母前的數字串的長度。

如果您不需要數字是存在的字符串中,你可以只使用

[A-Za-z]+$ 

在上述兩種,當然,你也使用^ $匹配的斷行選項

+0

你是對的,這個例子適用。但不是一個普通的替代品\ K –

+0

@HansSchindler我在回覆最後一行關於匹配「整個匹配」中的「五」的問題。我不知道Java/Python中的\ K的一般替換。 –

+0

是的,我喜歡和+ 1你的答案,但不能真正說出正確的答案在標題問題謝謝你,對不起:) –