.net 匹配可选的捕获组
我想匹配一个xml元素并为可选属性创建一个组。如果属性不存在,那么我将执行其他一些操作。比如我有.net 匹配可选的捕获组,.net,regex,.net,Regex,我想匹配一个xml元素并为可选属性创建一个组。如果属性不存在,那么我将执行其他一些操作。比如我有 <customer display="no"> 我想匹配customer元素,但display属性可能不存在。在代码中,我将检查捕获组是否为空,如果为空,则执行一些自定义逻辑 所以我的正则表达式是 <customer.*(display="yes|no").*?> 当元素具有属性时,它与元素匹配是ok的,但如何使组成为可选的,以便检查元素是否包含在其中?尝试此正则
<customer display="no">
我想匹配customer元素,但display属性可能不存在。在代码中,我将检查捕获组是否为空,如果为空,则执行一些自定义逻辑
所以我的正则表达式是
<customer.*(display="yes|no").*?>
当元素具有属性时,它与元素匹配是ok的,但如何使组成为可选的,以便检查元素是否包含在其中?尝试此正则表达式:
<customer.*?(display="(?:yes|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")?.*?>
还要注意的是
(display=“yes | no”)
可能与您想要的不匹配:它匹配display=“yes
或no”
而不是display=“yes”
或display=“no”
。我怀疑你想要(display=“(?:yes | no)”)
。我试过了,但它让匹配变得贪婪,但我刚刚发现这是因为第一次任何字符匹配都是贪婪的。我试过了,但这让比赛变得贪婪,但我发现这是因为第一次任何角色比赛都是贪婪的。是的,我刚刚发现问题是第一个。*贪婪,应该是。*?是的,我刚刚发现问题是第一个。*贪婪,应该是。*?不要使用正则表达式进行XML解析!!!根据您使用的.NET标记。在.NET中,我们有XmlReader、XmlDocument和XDocument——处理XML的标准类。不要使用正则表达式进行XML解析!!!根据您使用的.NET标记。在.NET中,我们有XmlReader、XmlDocument和XDocument——处理XML的标准类。