多行正则表达式没有捕捉到正确的掩码

Multiline Regex not catching the correct mask

我正在尝试使用此正则表达式在文件中捕获具有特殊语法的标记:

([a-z0-9 >}\/])(\{(var)\:([a-z0-9\_\/\-\.]+)([\?0-9]+)*\})([a-z0-9 {<\/])

标签看起来像:

 {var:contactText}

但是正如您在我的正则表达式中看到的那样,我想了解 {var:something} 前后的内容。我的表达式工作正常,除非表达式单独在一行中。 我有 m 标志来防止出现问题,但仍然没有用。

实例:https://regex101.com/r/6T6OJm/1/

我错过了什么吗? ([a-z0-9 {<\/])的最后一部分好像是不接受换行的,那怎么解决呢?

像猫一样,“多线”修饰符是一个虚假的朋友。 m 修饰符并不意味着模式会 运行 神奇地跨越多行,它只是改变了 ^$ 锚点的含义(从字符串的 start/end 到start/end 行)。

您所需要的只是使用 \s class 计算潜在的白色字符(还包括回车 return \r 和换行符 \n 个字符)。

~
    ([a-z0-9 >}/])
    \s* ( { (var) : ([a-z0-9_/.-]+) ([?0-9]+)? } ) \s*
    ([a-z0-9 {</])
~xi

demo

请注意,模式中的许多字符不需要转义。 由于模式有点长,我使用 x 修饰符不考虑模式中的空格:它更具可读性。

不确定所有捕获组是否都有用。