2012-11-01 48 views
1

我有一個文件,需要使用正則表達式來閱讀。字符串基本上可以包含任何內容(大寫,小寫,空格,符號等),只要該行不超過60個字符。我試過的方法適用於文件中的大多數字符串,但是,我需要能夠允許引號,這也是我卡住的地方。這是迄今爲止我嘗試過的。將正則表達式與裏面的引號匹配?

else if (data.matches("[A-Za-z0-9 ,.?!%&()@$-_:;\\\"]+$") 
      && !label.equals("") && prompt.equals("") && data.length() <= 60) 
     { 
      prompt = data; 
     } 

它讀取一切都在罰款一樣,除了以下字符串

Yes, but an error is displayed, 「Fuser out.」 

不要問拼寫,這是什麼在我給出的示例文件。

感謝您的幫助,希望我會得到迴應之前,我離開了洗衣店,因爲我在長島和在家裏得益於颶風沒有權力或互聯網。

+0

如果人們已經回答你的任何問題,在過去,你應該考慮回去,並通過點擊投票箭頭下方勾選其標記爲「已接受」。 :) – asteri

+0

文件是否可以包含方括號? –

回答

2

在你的正則表達式添加\"例如下面:

data.matches("[A-Za-z0-9 ,.?!%&()@$-_:;\"\\]+$") 

其中使用\",它將使用"作爲文字相匹配。

+1

當前字符類(在正則表達式中變成'\「)中的'\\\''已經被解釋爲一個字符'」'字符 –

+0

噢,好吧,這很有道理,謝謝,我最終簡化了它雖然經過一些更多的在線搜索(發現我可以使用一段時間來匹配所有字符,這使得事情變得更容易一些),我會在一篇文章中發佈我的解決方案(因爲我接受所有角色,但是,謝謝你回答這個問題肯定有助於我改進自己的正則表達式技巧 – audiFanatic

+0

@audiFanatic很高興你找到了解決方案,但你應該注意到,這個答案實際上並沒有改變正則表達式的意義,字符類'[「]'和'[\ 「]'('」[\「]」和'「[\\\」]「'作爲Java字符串)的處理方式完全相同。 –

0

這是複製粘貼從您的代碼

"Yes, but an error is displayed, \"Fuser out.\"".matches("[A-Za-z0-9 ,.?!%&()@$-_:;\\\"]+$")); 

,並返回true,所以它是確定。

但是我從代碼中複製粘貼時遇到問題。 「你的字符串中的字符」Fuser out。「與你的正則表達式中的字符不同」

0

你可能有,因爲它使用smart quotes匹配該字符串的問題。下面的文章有一些這方面的好信息:Handy regexes for smart quotes

的細節上,你可以將這些字符添加到使用下面的Unicode您正則表達式轉義:

\u201C\u201D\u201E\u201F\u2033\u2036 

此外,它看起來像你目前打算在您的正則表達式中使用\"(Java字符串中的\\\"),在您的角色類中同時使用反斜槓和雙引號。這並不是你想象的那樣,\"只會匹配你正則表達式中的字符",它只是有一個不必要的反斜槓。要將反斜槓實際包含爲有效字符,您需要在您的java字符串中連續使用四個反斜槓。

您還需要躲避連字符,否則$-_被解釋爲一個字符範圍。

因此新的正則表達式將是這個樣子:

data.matches("[A-Za-z0-9 ,.?!%&()@$\\-_:;\\\\\"\\u201C\\u201D\\u201E\\u201F\\u2033\\u2036]+$") 
+0

是否不會從文件中排除反斜槓? –

+0

@Asad剛剛編輯我的答案澄清了一點。原來的正則表達式不允許backsl如果這是需要的話,需要包含一個額外的反斜槓(兩個在Java字符串中)。 –

0

以下是我結束了簡化它,如果有人有興趣。

if (data.matches("\n")) 
     { 
      // do nothing, ignore 
     } 
     else if (data.matches("[^ ]+$") && label.equals("") 
      && data.length() <= 60) 
     { 
      label = data; 
     } 

     else if (data.matches(".+$") 
      && !label.equals("") && prompt.equals("") && data.length() <= 60) 
     { 
      prompt = data; 
     } 

     else if (data.matches(".+$") 
      && !label.equals("") && !prompt.equals("") && message.equals("") 
      && data.length() <= 60) 
     { 
      message = data; 
     } 

     else if (data.matches("[^ ]+[ ]+[0-9]$") && label.equals("") 
      && prompt.equals("") && message.equals("") && data.length() <= 60) 
     { 
      children = data; 
      String[] info = children.split("[ ]+"); 
      parent = info[0]; 
      numChildren = Integer.parseInt(info[1]); 

      tree.getNodeReference(parent).setNumChildren(numChildren); 
     }