我想匹配一个 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)
定义一个非捕获组。