2011-06-29 45 views
7

正則表達式似乎沒問題,因爲第一行代碼正確地用「helloworld」代替子字符串,但是後者中的表達式不匹配,因爲我不能看到「whynothelloworld?」在控制檯上Pattern.matches不起作用,而replaceAll卻起作用

System.out.println(current_tag.replaceAll("^[01][r]\\s", "helloworld")); 

if (Pattern.matches("^[01][r]\\s", current_tag)) { System.out.println("whynothelloworld?");} 

回答

15

Pattern.matches()預計整個字符串匹配,不只是一個字符串。

使用.find()法正則表達式匹配對象,而不是:

Pattern regex = Pattern.compile("^[01]r\\s"); 
Matcher regexMatcher = regex.matcher(current_tag); 
foundMatch = regexMatcher.find(); 
+0

似乎每個人都是這樣,但當我第一次來到Java時,我犯了這個錯誤。我不知道如何逃脫。不知何故,我總是很幸運地使用'find',從來沒有'匹配',這是在我注意到差異之前。我想這是因爲我在第一個Java項目中進行了增量匹配,現在是long(ish)ago。不過,我認爲這是一個設計/用戶界面缺陷,他們做了這個愚蠢的事情。 – tchrist

+0

Even weirder是Python:'re.match'隱式地將正則表達式錨定到字符串的開頭(但不是結尾),而're.search()'的行爲與預期的一樣(比如''matcher.find()''在Java中)。 –

+0

現在很清楚:) tnx分配,它就像一個魅力! –

-3

它不能再匹配,因爲你只是用「helloworld」代替它。

編輯:對不起,我忘了這是如何工作的。

+0

'replaceAll'返回一個新字符串 - 它不能更改現有字符串的內容,因爲字符串是不可變的。 –

+0

@Jon Skeet:好的,看起來我的Java變得有點生疏了。 :-p – Sqenqe

相關問題