我想匹配一个 xml 元素并为一个可选属性创建一个组。如果该属性不存在,那么我将执行一些其他操作。例如我有
<customer display="no">
我想匹配客户元素,但显示属性可能不存在。在代码中,我将检查该捕获组是否为空,如果是,则执行一些自定义逻辑。
所以我的正则表达式是
<customer.*(display="yes|no").*?>
当它具有属性时,它与元素匹配,但是我如何使组成为可选的,以便我可以检查是否包含该元素?
您可以在组后面放一个问号,就像正则表达式的任何其他可选组件一样。如果这样做,您还必须使第一个.*懒惰(通过添加?),否则它将消耗整行。
所以你应该有这样的东西:
<customer.*?(display="yes|no")?.*?>
另请注意,它(display="yes|no")可能与您想要的不匹配:它匹配display="yes或no" 不 display="yes"匹配或display="no". 我怀疑你想要(display="(?:yes|no)")。
试试这个正则表达式:
<customer.*?(display="(?:yes|no)").*?>
解释:
?匹配前一个元素零次或一次。
*?匹配前一个元素零次或多次,但尽可能少。
(?: subexpression)定义一个非捕获组。