2015-09-07 60 views
1

我在Java中有一個正則表達式的問題。以下亦宜Java正則表達式模式不會做在線測試工具所說的

2x 1 piece 
63x 9 pieces 
4x 1 piece 
1 piece 
23 pieces 

與此正則表達式:

((\w+)x\s)*(\w+)\s*(\w*) 

大家都知道,我們要逃避Java中的字符串。我躲過了正則表達式,我試圖用這一個:

String regex = "((\\w+)x\\s)*(\\w+)\\s*(\\w*)"; 

現在到了我的問題:對正則表達式的所有在線服務記住我的模式是有效的,但藥粥的Java。他們不標記可能是錯誤的,所以我不能真正看到我的問題。這是我想在Java中使用的代碼:

String regex = "((\\w+)x\\s)*(\\w+)\\s*(\\w*)"; 
Pattern r = Pattern.compile(regex); 
Matcher m = r.matcher(someClassWithMethods.text()); 
int multiplier=0; 
int value= 0; 
String supplement = ""; 
if (m.find()) { 
    multiplier= Integer.parseInt(m.group(2)); 
    value= Integer.parseInt(m.group(3));  
    supplement = m.group(4); 
} 

我調試了整個事情,看看發生了什麼事情,所有變量都如預期,但我仍然得到一個空組。這個正則表達式有什麼問題?

編輯

我已經改變了,由於一些評論幾件事情,我已經逮住我NumberException有附加條款,如果。現在我仍然沒有得到匹配的結果。那可能是什麼? 有我的新代碼:

String regex = "(?:(\\w+)x\\s)?(\\d+\\s+)(pieces?)"; 
Pattern r = Pattern.compile(regex); 
Matcher m = r.matcher(quantityCell.text()); 
int quantityMultiplier = 0; 
int quantity = 0; 
String supplement = ""; 
if (m.find()) { 
    if(m.group(1) != null){ 
      quantityMultiplier = Integer.parseInt(m.group(1)); 
    } 
    quantity = Integer.parseInt(m.group(2));  
    supplement = m.group(3); 
} 
+2

你所說的 「空組」 呢?你得到的確切輸出是什麼?我試過了,它對我來說工作得很好... – Codebender

+0

你的正則表達式真的很不高效。爲什麼不使用'(?:\\ w + x \\ s)?\\ d + \\ s + pieces?'(未經測試的代碼) – TheLostMind

+0

我猜NumberFormatException?但是用你的代碼(如果不是while),我不認爲它會得到這個異常。 – nhahtdh

回答

1

你的正則表達式是怪異:

  • \w+爲什麼匹配「單詞字符」當你只在數字的前兩個實例有興趣嗎?
  • ​​爲什麼這是一個捕獲組?你不想要結果。
  • ((\w+)x\s)*這是爲什麼重複?你是否期待多重乘數?正則表達式只會捕獲最後一個乘數,如果存在多個乘數。

讓我們嘗試用這個代替:

(?:(\d+)x\s)?(\d+)\s(\w*) 

由於第一個捕獲是可選的,這將是null如果不存在,所以你需要檢查這一點。

public static void main(String[] args) { 
    test("2x 1 piece"); 
    test("63x 9 pieces"); 
    test("4x 1 piece"); 
    test("1 piece"); 
    test("23 pieces"); 
} 
private static void test(String input) { 
    String regex = "(?:(\\d+)x\\s)?(\\d+)\\s(\\w*)"; 
    Pattern p = Pattern.compile(regex); 
    Matcher m = p.matcher(input); 
    if (m.find()) { 
     int multiplier = (m.group(1) != null ? Integer.parseInt(m.group(1)) : -1); 
     int value = Integer.parseInt(m.group(2)); 
     String supplement = m.group(3); 
     System.out.printf("%d, %d, '%s'%n", multiplier, value, supplement); 
    } 
} 

輸出

2, 1, 'piece' 
63, 9, 'pieces' 
4, 1, 'piece' 
-1, 1, 'piece' 
-1, 23, 'pieces' 
+0

這是我正在等待的真正答案。萬分感謝。我有一段時間沒有使用正則表達式。這就是爲什麼我沒有想到非捕獲組。我已經使用了\ w +,因爲我首先檢查了輸出而沒有單獨處理「x」字符,之後我忘了更改它。祝你有美好的一天! :) – TheRealNoXx