示例文字
this text will be left alone ##{class1}{arg1;arg2;arg3}## some other text and
another thingie ##{Class2}{]##
目前我正在使用此'/\#\#\{(?P<class>.+)\}\{(?P<args>.+)\}\#\#/i'
来匹配它,但我的问题是,当此正则表达式多次出现时,因为它甚至会匹配两个匹配模式之间的文本。
这是我的正则表达式##{ClassName1}{arg1;arg2;arg3}## some other random ##{class2}{}##
的结果。
是否有更优雅的方法从字符串中提取##{class1}{arg1;arg2;arg3}##
和##{Class2}{]##
并将其替换为相应类的输出?
我正在使用它来替换Class1和Class2的输出,其中参数介于第二组{}
注意:如果第二组{}为空,则意味着没有参数传递给第一组{}
中具有名称的类答案 0 :(得分:5)
问题在于.+
是“贪婪的” - 只要模式的其余部分仍可以解析,它将消耗它可能的每个角色。
脏的通用解决方案是执行.+?
,它将匹配满足模式其余部分所需的最少字符,并且在这种情况下可以正常工作。
但一般来说,最好还是写一些比.+
更具体的东西。在你的情况下,[^}]+
会工作吗?也就是说,在{
和}
符号之间,您可以包含任意数量的不是结束{0}}的字符。