2013-02-14 21 views
1
 
Input-> Input!RC + Calc!R[1]C[1] 

在輸出我想在這些操作:迭代通過正則表達式找到

 
RC and R[1]C[1] 

我嘗試:

 
private static void findMatch(String formula) { 
     Matcher m = Pattern.compile("\\W(R(\\[(.+?)\\])?C(\\[(.+?)\\]))") 
     .matcher(formula); 
     // Matcher m = Pattern.compile(
     // "\\W(R(\\[(.+?)\\])?C) | \\W(R(\\[(.+?)\\])?C(\\[(.+?)\\]))") 
     // .matcher(formula); 
     for (; m.find(); m.reset(formula)) { 
      System.out.println(m.group(3)); 
     } 

    } 

它看起來並不第二模式以及它進入無限循環。

這是怎麼回事?

回答

4

嘗試以下操作:

String formula = "Input!RC + Calc!R[1]C[1]"; 
Matcher m = Pattern.compile("\\W(R(\\[(.+?)\\])?C(\\[(.+?)\\])?)").matcher(formula); 
while (m.find()) { 
    System.out.println(m.group(1)); 
} 

輸出:

RC 
R[1]C[1] 

這裏主要的變化是循環的工作方式,我有什麼上面是迭代一個模式的匹配的典型方式。我還打印m.group(1)而不是m.group(3),因爲它是第一個包含整個匹配的組,除了!之外,我認爲這是您想要的。

您的正則表達式的唯一更改是在第二個(\\[(.+?)\\])組後添加?以使其成爲可選項。

+0

我有這個只有一個擔憂:當我試圖取代一個特定羣體,比如R [1] C,它也取代了我不想要的R [1] C [1]部分,並給出了錯誤的輸出。你在想什麼,我該如何處理這種情況? – AnujKu 2013-02-14 02:58:25

+0

您需要編寫正則表達式,使其只匹配要替換的字符串。如果你想替換R [1] C'而不是'R [1] C [1]',那麼你應該在'C'後改變'(\\ [(。+?)\\])?''到'(?!\\ [(。+?)\\])'。這是一個負向前視,意思是「如果字符串中的下一個字符匹配'\\ [(。+?)\\'''」,則匹配失敗。 – 2013-02-14 17:23:11

1

你期望這段代碼做什麼?

for (; m.find(); m.reset(formula)) { 
    System.out.println(m.group(3)); 
} 

對於每一個循環中,它調用先後m.reset(公式),重置匹配,使其從0開始,然後m.find(),它查找字符串在接下來的比賽。由於您以前稱爲reset(),因此下一場比賽是第一場比賽。因此你有一個無限循環。

如果你要查找的字符串中的所有比賽中,簡單地寫:

while(m.find()) { 
    System.out.println(m.group(1)); 
}