2011-09-16 154 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