正则表达式模式嵌套在其他模式中

时间:2013-03-25 16:18:00

标签: regex

我有一个包含一些嵌入变量的字符串,我需要提取这些变量的名称。我不熟悉正则表达式,我无法让它工作。

以下是字符串外观的示例:

  

Lorem ipsum dolor sit amet {%#varName1%},consectetur adipisicing #non_var elit,sed

     

{%#varName2 | prop1%}做eiusmod tempor incididunt ut labore et dolore magna aliqua

     

{%identifier#varName3 | prop2%}。 Ut enim ad minim veniam。

变量名称以#为前缀,并放在这些分隔符{%%}内。使用此表达式,我可以匹配变量名称:

(?<=#)(.*?)(?=[\s\|])

然而,这也匹配#non_var,它不在分隔符内,也不是有效变量。

我也试过这个:

(?<={% )(#(.*?)[^\s\|])(?= %})

但这仅匹配#varName1#varName2|prop1(我不需要prop1部分)。预期结果是匹配:

varName1varName2varName3

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:1)

由于您尚未提及正在使用的语言/应用程序,我将提供一般用例;我自己已经在Notepad ++中尝试过它,并取得了成功。

您可以使用正则表达式:

(\{%[^#]*#)([\w]*)(.*?%\})

此处varname可能包含任意长度的字母,数字和下划线。如果要强制执行变量名称的第一个字符可能不是数字的条件,请使用:

(\{%[^#]*#)([a-z_][\w]*)(.*?%\})

这将识别{%%}之间的所有内容。现在,您可以使用对第二个匹配的子表达式的反向引用(Notepad ++中的$2;许多编程语言中的\2)来获取varnames

输入文字

  

Lorem ipsum dolor sit amet {%#varName1%},consectetur adipisicing #non_var elit,sed {%#varName2 | prop1%} do eiusmod tempor incididunt ut labore et dolore magna aliqua {%identifier#varName3 | prop2%}。 Ut enim ad minim veniam。

我的搜索和替换给了我:

  

Lorem ipsum dolor sit amet varName1,consectetur adipisicing #non_var elit,sed varName2 do eiusmod tempor incididunt ut labore et dolore magna aliqua varName3。 Ut enim ad minim veniam。

答案 1 :(得分:0)

试试这个 - 我认为这是对的:

(?<=\{%.*#)[\w|]+(?=.*%\})