在Java中使用Regex Look Around所需的建议

时间:2011-09-16 23:51:52

标签: java regex

我在我的项目中大量使用regexp。我需要一些测试字符串的建议:

1     string           3.33
      string
      1
      string          -3.33

我需要匹配第2行和第3行(意味着我不需要在行尾有3.33(货币)的字符串)。 我尝试了很多变化。我得到的最好的是:

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

第2行与此正则表达式匹配,但第3行不匹配。

注意:我关心线的开头或结尾。因此,上面标记的测试线具有完美的空白。

我使用Java作为编程语言。

2 个答案:

答案 0 :(得分:1)

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

character class。字符类恰好与方括号中描述的字符集中的一个字符匹配。你的相当于:

[^!()+.\d]

开头的^反转集合,\d匹配一个数字,就像它在字符类之外一样,但其余字符按字面匹配。换句话说,您告诉它匹配任何不是!()+.或数字的字符。

看起来你正试图使用​​负向前瞻,这是一种有效的方法。如果你只关心行尾的美元金额,你可以这样做:

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

前瞻尝试匹配行尾的\d+\.\d+。如果成功,则整体匹配失败。否则,.*$会占用整行,因此您可以使用匹配器的group()方法检索它。

这假设您一次将正则表达式应用于一行。如果您试图在较大的文本中找到匹配的行,则应指定MULTILINE模式,您可以这样做:

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

答案 1 :(得分:0)

你是否逐行测试文字?

然后您可以使用re:\d+\.\d+$来匹配 NOT 需要的文字。如果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