正则表达式可在特定XML标记内匹配括号前的单词

时间:2018-11-21 17:15:17

标签: regex

我想写一个正则表达式来匹配需要两个条件的单词。

  1. 位于XML action 标记内。我为此写了一个正则表达式:

    ([^<>])*(?=<\/action>)

  2. 匹配括号前的单词。像这样:

    ((\w+)(?=\s?\())

将两个表达式组合为一个不起作用。有什么想法吗?

([^<>])((\w+)(?=\s?\())(?=<\/action>)

使用以下文本,正则表达式应匹配所有出现的单词 add

<action>add();</action>

<action name="foo">add();</action>

<action>
   add();
</action>

1 个答案:

答案 0 :(得分:0)

这是您要查找的正则表达式,它需要满足您的两个正则表达式条件,

(?s)(?:<action[^>]*>\s*\K)\w+(?=\s?\(\).*<\/action>)

此正则表达式将同时满足您的两个条件,

  1. 单词应放在<action>标记之间
  2. 单词前面带有括号

说明:

  • (?s)->需要启用与新行匹配的点,因为我看到您的标签可以分布在多行中。
  • (?:<action[^>]*>\s*)->这与action标签匹配,其中action标签可以选择包括任何种类的属性。 \ s *是要吃掉我们不希望与单词匹配的任何空格。
  • \K->重置所有匹配项,因此根据OP的帖子仅匹配单词。为什么要这样做,因为否定组后面的表情不允许量词,并且同时允许正则表达式与标记内的任何可变长度输入匹配,从而使正则表达式变得健壮。
  • \w+->捕获想要的单词
  • (?=\s?\(\).*<\/action>->正向查找,以确保其后跟(),后跟零个或多个任何字符,后跟标记。

Click here for demo

此外,您希望此正则表达式([^<>])*(?=<\/action>)确保与<action>标签之间的单词匹配的方式,此正则表达式还不够,因为它也将与此匹配,

add</action>

未包含在<action>标记中。

希望这会有所帮助,让我知道您是否还有任何疑问。