我正在处理一个问题,它可能有简单的解决方案,但我就是想不起来它...我有一个XML文件输入,只是为了测试,我把一个结构下面。
- 我的目标 *:用于输入String s; s ==元素的“name”属性值con:testSuite,(我们选择 * SUITE 2 *)
我想匹配元素中的每个'name'值con:testCase,但只在所选testSuite元素的testCase元素内部。
我的正则表达式(regex 101测试):
(?<=<con:testSuite[\d\D]{1,60}name=\"SUITE2\")(?:[\d\D]*?<con:testCase[\d\D]*?name=\")(.*?)(?:\")(?=[\d\D]*?</con:testSuite)
在Java中:Pattern.compile("(?<=<con:testSuite[\\d\\D]{1,60}name=\\\"SUITE2\\\")(?:[\\d\\D]*?<con:testCase[\\d\\D]*?name=\\\")(.*?)(?:\\\")(?=[\\d\\D]*?</con:testSuite)")
现在这个正则表达式只返回第一个testCase中的名称值。如果我删除第一个不匹配组中的第一个lazy,那么只返回最后一个...然而,当我阅读它时,如果没有lazy,匹配每个testCase的名称值对我来说是有意义的。
...无论如何,我继续前进,因为这绝不是一个生产代码,只是我的实用工具,而且我可以猜测xml中检查点之间的最大字符数,我选择将非捕获组移动到lookbehind的一部分(并使其成为固定长度的ofc)
(?<=<con:testSuite[\d\D]{1,60}name=\"SUITE2\"[\d\D]{1,60000}<con:testCase[\d\D]{1,50000}name=\")(.*?)(?:\")(?=[\d\D]*?</con:testSuite)
现在,这在查找所有值方面很神奇,但是它仍然有一个问题,即前瞻性-〉我已经得到了[\d\D]*withlazy,但是它忽略了〈/con:testSuite的第一个出现,并匹配最后一个可能的,因此它不符合我关于仅在一个选定的con:testSuite元素中的值的条件......我的Xmas心态无法抗拒这一点:)
很抱歉的长职位,任何帮助是赞赏〈3
- 对于选择的SUITE 2,所需匹配项[]=[“55555”,“66666”,“77777”,“88888”]
- 测试xml结构:
<con:testSuite id="dd1107cb-2f4c-47bd-8af5-f64e0d20354b" name="SUITE1" disabled="true">
<con:testCase seOnErrors="true" name="44444" searchProp>sdfsddsfsdsd
</con:testCase>
<con:testCase seOnErrors="true" name="33333" searchProp>sdfsddsfsdsd
</con:testCase>
<con:testCase seOnErrors="true" name="22222" searchProp>sdfsddsfsdsd
</con:testCase>
<con:testCase seOnErrors="true" name="11111" searchProp>sdfsddsfsdsd
</con:testCase>
</con:testSuite>
<con:testSuite id="dd1107cb-2f4c-47bd-8af5-f64e0d20354b" name="SUITE2" disabled="true">
<con:testCase seOnErrors="true" name="55555" searchProp>sdfsddsfsdsd
</con:testCase>
<con:testCase seOnErrors="true" name="66666" searchProp>sdfsddsfsdsd
</con:testCase>
<con:testCase seOnErrors="true" name="77777" searchProp>sdfsddsfsdsd
</con:testCase>
<con:testCase seOnErrors="true" name="88888" searchProp>sdfsddsfsdsd
</con:testCase>
</con:testSuite>
<con:testSuite id="dd1107cb-2f4c-47bd-8af5-f64e0d20354b" name="SUITE3" disabled="true">
<con:testCase seOnErrors="true" name="99999" searchProp>sdfsddsfsdsd
</con:testCase>
<con:testCase seOnErrors="true" name="0000" searchProp>sdfsddsfsdsd
</con:testCase>
<con:testCase seOnErrors="true" name="11221122" searchProp>sdfsddsfsdsd
</con:testCase>
<con:testCase seOnErrors="true" name="33443344" searchProp>sdfsddsfsdsd
</con:testCase>
</con:testSuite>
1条答案
按热度按时间uwopmtnx1#
您的正则表达式尝试当然是令人生畏的,但是这个问题是一个典型的例子,可以精确地指出什么时候不使用正则表达式。XPath是正确的工具。
请参阅下面的XPath:
在https://www.freeformatter.com/xpath-tester.html上亲自尝试一下
只需确保正确命名XML数据: