正则表达式:仅回溯第一次出现(非贪婪的回顾?)

时间:2018-01-18 23:36:17

标签: regex

问题在于:

XML:

<userPermissions>
    <enabled>true</enabled>
    <name>ViewPublicReports</name>
</userPermissions>
<userPermissions>
    <enabled>true</enabled>
    <name>ViewRoles</name>
</userPermissions>
<userPermissions>
    <enabled>true</enabled>
    <name>ViewSetup</name>
</userPermissions>

我想要匹配的是:

<userPermissions>
    <enabled>true</enabled>
    <name>ViewRoles</name>
</userPermissions>

我设法放在一起的所有模式都匹配第一个字符串:

(?<=<userPermissions>)[\s\S]+?ViewRoles[\s\S]*?<\/userPermissions>

不太确定如何使“ViewRoles”非贪婪地向后匹配。

提前感谢您的帮助。

*编辑:我正在使用一种在Salesforce实例之间部署元数据的工具,这些实例被捕获为XML。该工具提供了“查找/替换”功能,该功能使用正则表达式来查找“查找”。我没有使用XML解析器的选项。

2 个答案:

答案 0 :(得分:1)

<userPermissions>(?:(?!</userPermissions>)[\S\s])*?ViewRoles[\S\s]*?</userPermissions>

匹配该标记。

Formatted

 <userPermissions>
 (?:
      (?! </userPermissions> )
      [\S\s] 
 )*?
 ViewRoles
 [\S\s]*? 
 </userPermissions>

答案 1 :(得分:0)

有人告诉我,但提取这个的正确方法是使用XML解析器。但是,您也可以使用the following regex

(.+\n){2}.+ViewRoles.+\n.+

实际上与以下结构相匹配:

  • 2行没有限制
  • 包含“ViewRoles”的行
  • 另一排没有限制