2014-01-22 27 views
0

Java代碼:Java的正則表達式:字邊界匹配器在一個字符串

import java.util.regex.*; 

class Test { 
    public static void main(String[] args) { 
     String r = "\\bdog\\b"; 
     Pattern p = Pattern.compile(r); 
     String text = "abc dog def"; 
     System.out.println(p.matcher(text).matches()); 
    } 
} 

等效Perl代碼:

$x = "abc dog def"; 
if ($x =~ /\bdog\b/) { 
    print "matches"; 
} 

Perl代碼的行爲與預期,並打印字符串 「abc狗DEF」匹配給定的正則表達式。另一方面,Java代碼表示該字符串與正則表達式不匹配。我正在犯一些愚蠢的錯誤?有趣的是,如果我在cmd行上輸入正則表達式(不是字符串文字),如Oracle Docs所示,那麼它就可以正常工作。

回答

5

不同之處在於,Java中的matches表示與整個字符串相匹配,而不僅僅是Perl中的一部分。就好像存在隱含的^$

這是很方便的知道,在Java中,

  • find查找匹配的字符串的任何地方(可以重複)
  • lookingAt查找匹配的字符串
  • 的開始
  • matches

匹配整個字符串另見

+0

'在Java中匹配的手段匹配整個字符串,'謝謝! – Cheeso

1

的Javadoc Matcher#matches()狀態

嘗試的整個區域與模式相匹配。

所以它試圖匹配整個abc dog def。它不是試圖檢查Pattern是否出現在String中。爲此,使用Matcher#find()

嘗試查找 與模式匹配的輸入序列的下一個子序列。

0

不像只需要匹配輸入的部分是真實的大多數其他語言,Java的matches()必須整個字符串匹配,因此從Perl來java的轉換,只需添加.*到的每一端正則表達式:

String text = "abc dog def"; 
if (text.matches(".*\\bdog\\b.*")) // true 
1

的問題是使用matches代替find。匹配期望整個字符串匹配\bdog\b,這顯然沒有。

這是你所需要的:

import java.util.regex.*; 

class Test { 
    public static void main(String[] args) { 
     String r = "\\bdog\\b"; 
     Pattern p = Pattern.compile(r); 
     String text = "abc dog def"; 
     Matcher m = p.matcher(text); 
     while(m.find()) { 
     System.out.println(m.group()); 
     } 
    } 
} 

感謝您發佈在您的文章工作代碼,那我就可以剪切,粘貼,編譯和運行,而不必惹它周圍,或找出丟失的部分。