Java Regex ->如何让整个前瞻变得懒惰

np8igboo  于 2022-12-21  发布在  Java
关注(0)|答案(1)|浏览(140)

我正在处理一个问题,它可能有简单的解决方案,但我就是想不起来它...我有一个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>
uwopmtnx

uwopmtnx1#

您的正则表达式尝试当然是令人生畏的,但是这个问题是一个典型的例子,可以精确地指出什么时候使用正则表达式。XPath是正确的工具。
请参阅下面的XPath:

//con:testSuite[@name='SUITE2']/con:testCase/@name

https://www.freeformatter.com/xpath-tester.html上亲自尝试一下
只需确保正确命名XML数据:

<?xml version="1.0" encoding="UTF-8"?>
<con:test xmlns:con="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="./example1.xsd">
   <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>
</con:test>

相关问题