2012-03-05 110 views
2

對於字符串值"ABCD_12"(包括引號),我想只提取的內容和排除了雙引號,即ABCD_12。我的代碼是:正則表達式 - Java的

private static void checkRegex() 
{ 
    final Pattern stringPattern = Pattern.compile("\"([a-zA-Z_0-9])+\""); 
    Matcher findMatches = stringPattern.matcher("\"ABC_12\""); 
    if (findMatches.matches()) 
     System.out.println("Match found" + findMatches.group(0)); 
} 

現在,我已經嘗試過做findMatches.group(1);,但只返回最後一個字符字符串中(我不明白爲什麼!)。

我該如何提取只留下雙引號的內容?

+0

請嘗試提供具體標題問題 - 這個基本標題有幾十個問題 – DNA 2012-03-05 22:24:07

回答

6

試試這個正則表達式:

Pattern.compile("\"([a-zA-Z_0-9]+)\""); 

OR

Pattern.compile("\"([^\"]+)\""); 

問題在你的代碼是放錯地方+外右括號。 這是導致捕獲組只捕獲1個字符(因爲+在外面),這就是爲什麼最終只能得到最後一個字符的原因。

+0

知道了!謝謝anubhava – 2012-03-05 21:51:18

+0

不客氣。 – anubhava 2012-03-05 21:53:17

1

一個不錯的簡單(讀:非正則表達式)的方式來做到這一點是:

String myString = "\"ABC_12\""; 
String myFilteredString = myString.replaceAll("\"", ""); 
System.out.println(myFilteredString); 

讓你

ABC_12 
1

您應該將模式改成這樣:

final Pattern stringPattern = Pattern.compile("\"([a-zA-Z_0-9]+)\"");

請注意,+標誌已移到組內,因爲您wa nt字符重複成爲該組的一部分。在你發佈的代碼中,你實際搜索的是該組的重複,其中包括在[a-zA-Z_0-9]中單個字符的單次發生。

1

如果你的模式是嚴格的在雙引號之間的任何文本,那麼你可以使用子會更好:

String str = "\"ABC_12\""; 
System.out.println(str.substring(1, str.lastIndexOf('\"'))); 

假設這是一個比較複雜的(在一個更大的字符串之間雙引號),你可以使用分裂()函數模式類和使用\「作爲你的正則表達式 - 這將拆分字符串圍繞\」這樣你就可以很容易地提取內容你想

Pattern p = Pattern.compile("\""); 
    // Split input with the pattern 
    String[] result = 
      p.split(str); 
    for (int i=0; i<result.length; i++) 
     System.out.println(result[i]); 
    } 

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html#split%28java.lang.CharSequence%29