我在我的项目中大量使用regexp。我需要一些测试字符串的建议:
1 string 3.33 string 1 string -3.33
我需要匹配第2行和第3行(意味着我不需要在行尾有3.33(货币)的字符串)。 我尝试了很多变化。我得到的最好的是:
^[\s]+.+[^(?!(\d+\.\d+))]$
第2行与此正则表达式匹配,但第3行不匹配。
注意:我关心线的开头或结尾。因此,上面标记的测试线具有完美的空白。
我使用Java作为编程语言。
答案 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