正则条件
Regex conditition
我的模板条件有问题 class。
我做错了什么?
/@if\((?P<condition>.*)\)\n*\s*(?P<content>(?s:[\=\"\;\,$\{\}\_\(\)\.\!\'\-\:\s\/\<\>\w\näöüÄÖÜèéà@]*))@endif/m
正则表达式 Link :
https://regex101.com/r/hE4hX3/3
您应该使用不贪婪的运算符 *?
和 g
标志来进行多个匹配以实现您想要的:
/@if\((?P<condition>.*)\)\n*\s*(?P<content>(?s:[\=\"\;\,$\{\}\_\(\)\.\!\'\-\:\s\/\<\>\w\näöüÄÖÜèéà@]*?))@endif/mg
或简化:
/@if\((?P<condition>.*?)\)\s*(?P<content>([\s\S]*?))@endif/mg
正则表达式是做这样事情的糟糕工具。
例如,您现在不能使用嵌套 if
s。
更好的是实现简单的解析器,这将使它的工作正确并可以扩展到新的语法。
不使用允许字符列表,而是使用带否定字符的禁止字符列表 类。示例:
~
@if \( (?P<condition> [^)]* ) \)
\s*
(?P<content> [^@]*+ (?: @(?!endif\b) [^@]* )*+ )
@endif
~x
代替 .*
条件(不知道在哪里停止),使用 [^)]*
抓住所有直到右括号。
内容相同,使用 [^@]*
并在每个 "@"
之后检查是否有 "endif"
。 (这样内容中允许"@"
。)
其他:写\n*\s*
没有意义,因为这两个是可选的,\s
已经包含\n
,所以我删除了它。
我的模板条件有问题 class。 我做错了什么?
/@if\((?P<condition>.*)\)\n*\s*(?P<content>(?s:[\=\"\;\,$\{\}\_\(\)\.\!\'\-\:\s\/\<\>\w\näöüÄÖÜèéà@]*))@endif/m
正则表达式 Link : https://regex101.com/r/hE4hX3/3
您应该使用不贪婪的运算符 *?
和 g
标志来进行多个匹配以实现您想要的:
/@if\((?P<condition>.*)\)\n*\s*(?P<content>(?s:[\=\"\;\,$\{\}\_\(\)\.\!\'\-\:\s\/\<\>\w\näöüÄÖÜèéà@]*?))@endif/mg
或简化:
/@if\((?P<condition>.*?)\)\s*(?P<content>([\s\S]*?))@endif/mg
正则表达式是做这样事情的糟糕工具。
例如,您现在不能使用嵌套 if
s。
更好的是实现简单的解析器,这将使它的工作正确并可以扩展到新的语法。
不使用允许字符列表,而是使用带否定字符的禁止字符列表 类。示例:
~
@if \( (?P<condition> [^)]* ) \)
\s*
(?P<content> [^@]*+ (?: @(?!endif\b) [^@]* )*+ )
@endif
~x
代替 .*
条件(不知道在哪里停止),使用 [^)]*
抓住所有直到右括号。
内容相同,使用 [^@]*
并在每个 "@"
之后检查是否有 "endif"
。 (这样内容中允许"@"
。)
其他:写\n*\s*
没有意义,因为这两个是可选的,\s
已经包含\n
,所以我删除了它。