Java 正则表达式与打印精美的文件不匹配
我刚刚开始使用正则表达式,所以我可能会犯一些愚蠢的错误。我有以下正则表达式:Java 正则表达式与打印精美的文件不匹配,java,regex,Java,Regex,我刚刚开始使用正则表达式,所以我可能会犯一些愚蠢的错误。我有以下正则表达式: String regex = "length ?= ?\"[\\+-]?\\d+(\\.\\d+)?\".*height ?= ?\"[\\+-]\\d+(\\.\\d+)?\""; 这与此文件/字符串正确匹配: <house length="120" prize="2000000" height="28"/> 但它不匹配 <house prize="2000000" lengt
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"/>
我觉得这真的很奇怪,因为它应该匹配第二个太。。。任何能为我指明正确方向的帮助都将不胜感激 您需要在模式中使用字符类(例如
[\s\n]
)或使用模式。多行(?m)
或模式.DOTALL
(?s)
)
- 堆栈溢出:
- 甲骨文:
您的问题是*
匹配除换行符以外的任何字符
您需要添加。你可以找到例子
另外,在您的第二个[\\+-]
案例之后,您忘记了一个?
length ?= ?\"[\\+-]?\\d+(\\.\\d+)?\".*height ?= ?\"[\\+-]?\\d+(\\.\\d+)?\"
在java中,它将为您提供:
Pattern.compile("length ?= ?\"[\\+-]?\\d+(\\.\\d+)?\".*height ?= ?\"[\\+-]?\\d+(\\.\\d+)?\"", Pattern.DOTALL);
请记住,String.matches()
不适用于标志,但您可以在字符串前面使用(?s)
,以使其正常工作。这似乎有效:
String regex="(.|\\s)* length ?= ?\"[\\+-]?\\d+(\\.\\d+)?\"(.|\\s)*height ?= ?\"[\\+-]?\\d+(\\.\\d+)?\"";
我用(.|\s)替换,在开头添加,并替换[\+-]?在右侧,在高度之后您希望得到什么作为输出?-有/无价值attribute@MayurKoshti我只想检查是否有两个属性长度和高度(可能还有其他属性介于两者之间),以及这些属性的值是否包含带可选小数点的数字。请尝试以下操作:]*length\=\“([^\“]+)\”[^>]*height=\”([^\“]+)\[^>]*>
多行在这方面对他没有帮助。@naurel:可能需要一些解释。他正在尝试将多行上的模式与*
匹配。多行修改器使^
和$
匹配行的开始和结束。这不是问题所在。使用此方法将使正则表达式复杂得多。@naurel:他们没有使用^
$
锚。。。并且可以使用多行模式:。每种情况都需要不同的解决方案,知道选择是什么是很重要的。你没有像他在你的例子中那样匹配相同的东西。如果你能用multiline做他想做的事情,我想学习一下。啊,好吧,问题是我的属性之间有换行符,
与换行符不匹配!正如我从文档中看到的,有两种可能应用s
修改器。1.在我的字符串和2前面写入(?s)
。将编译方法调用为Pattern.compile(someStr,Pattern.DOTALL)代码>这些方法中有哪一种比另一种更受推荐吗?我建议您使用Pattern.compile(someStr,Pattern.DOTALL)因为匹配模式应该在正则表达式之外指定。但我不知道是否有任何真正的影响。谢谢!这真的帮助了我!(我现在觉得自己像个傻瓜;)