我刚开始使用正则表达式,所以我可能会在这里做一些愚蠢的错误。我有以下正则表达式:
String regex = "length ?= ?\"[\\+-]?\\d+(\\.\\d+)?\".*height ?= ?\"[\\+-]\\d+(\\.\\d+)?\"";
这是正确匹配此文件/字符串:
<house length="120" prize="2000000" height="28"/>
但 匹配
<house prize="2000000"
length="-1200"
owner="Smith"
height="55.8"/>
我觉得这很奇怪,因为它也应该匹配第二个......任何帮助我指向正确方向的人都会非常感激!
答案 0 :(得分:1)
您需要在模式中使用字符类(例如[\s\n]
)来考虑换行符和空格,或者使用Pattern.MULTILINE
(?m)
或{{1} } Pattern.DOTALL
。
答案 1 :(得分:1)
这似乎有效:
String regex="(.|\\s)* length ?= ?\"[\\+-]?\\d+(\\.\\d+)?\"(.|\\s)*height ?= ?\"[\\+-]?\\d+(\\.\\d+)?\"";
我替换。,通过(。| \ s),在开头添加它,并替换[\ + - ]?在右边,高度后
答案 2 :(得分:0)
您的问题是.*
匹配除换行符之外的任何字符。
您需要添加s
modifier。您可以找到示例here。
另外,在第二个?
案例之后,您忘记了[\\+-]
。
length ?= ?\"[\\+-]?\\d+(\\.\\d+)?\".*height ?= ?\"[\\+-]?\\d+(\\.\\d+)?\"
在java中它会给你:
Pattern.compile("length ?= ?\"[\\+-]?\\d+(\\.\\d+)?\".*height ?= ?\"[\\+-]?\\d+(\\.\\d+)?\"", Pattern.DOTALL);
请注意,String.matches()
不使用标记,但您可以在字符串前使用(?s)
以使其正常工作。