2011-09-16 55 views
1

我在我的項目中大量使用了regexp。我需要一些建議測試字符串:正則表達式所需的建議Java中的正則表達式

 
1  string   3.33 
     string 
     1 
     string   -3.33 

我需要匹配的第二和第三線(意味着我不需要在該行的末尾其中有3.33(貨幣字符串))。 我嘗試了很多變化。我得到的最好的是:

^[\s]+.+[^(?!(\d+\.\d+))]$ 

第2行與此正則表達式匹配,但第3行不匹配。

注意:我關心線的開始或結束。所以上面標出的測試線都帶有完美的空格。

我使用Java作爲我的編程語言。

+0

我認爲StackOverflow的保存格式,這將有助於如果你縮進你的樣品輸入四個空格等等。這將有助於使問題更清楚。另外,您可以嘗試使用http://regexpal.com/或http://www.fileformat.info/tool/regex.htm –

+0

這樣的站點,然後我再次嘗試改進示例文本。 – renato

+0

我正在嘗試將縮進。請允許我一段時間。 – sankethm7

回答

0

您是否一行一行地測試文本?

那麼你可以使用re:\d+\.\d+$來匹配你所做的文字不是需要。如果match()返回false,那麼你就行了。

好吧,它就像grep -v。

如果使用grep測試:

kent$ cat a 
1  string   3.33 
     string 
     1 
     string   -3.33 

kent$ grep -Pv '\d+\.\d+$' a 
     string 
     1 
+0

肯特,實際上這是一個大計劃的一部分。我不能像你所建議的那樣去做。感謝您的建議,但。 – sankethm7

1
[^(?!(\d+\.\d+))] 

character class。一個字符類與您在方括號內描述的一組字符中的一個字符完全匹配。你的是相同的:

[^!()+.\d] 

^在開始反轉集,\d就像它的字符類之外的數字相符,但其餘字符逐字匹配。換句話說,你告訴它匹配不是!,(,),+,.或一個數字的任何一個字符。

它看起來像你試圖使用負向前視,這是一種有效的方法。如果你只關心在生產線末端的金額,你可以這樣做:

^(?!.*\d+\.\d+$).*$ 

先行嘗試在該行的末尾匹配\d+\.\d+。如果成功,整體匹配失敗。否則,.*$消耗整條線,因此您可以使用匹配器的group()方法檢索它。

這假設你一次應用正則表達式到一行。如果你想尋找一個更大文本中匹配的行應指定MULTILINE模式,你可以這樣做:

(?m)^(?!.*\d+\.\d+$).*$ 
+0

我想,這似乎是個好主意。我肯定會嘗試。我喜歡你的解釋。我會記住這一點以備後用。謝謝艾倫。 – sankethm7

+0

艾倫,正則表達式是我正在尋找的完美。我學到了更好的負面看法。感謝您的建議。 – sankethm7