我正在寻找一个正则表达式来转换类似的东西
{test}hello world{/test} and {again}i'm coming back{/again} in hello world i'm coming back.
我试过{[^}]+}
了,但是使用这个正则表达式,我不能只拥有测试中的内容和再次标记。有没有办法完成这个正则表达式?
我正在寻找一个正则表达式来转换类似的东西
{test}hello world{/test} and {again}i'm coming back{/again} in hello world i'm coming back.
我试过{[^}]+}
了,但是使用这个正则表达式,我不能只拥有测试中的内容和再次标记。有没有办法完成这个正则表达式?
正确执行此操作通常超出了正则表达式的能力。但是,如果您可以保证这些标签永远不会嵌套,并且您的输入永远不会包含不表示标签的花括号,那么这个正则表达式可以进行匹配:
\{([^}]+)}(.*?)\{/\1}
解释:
\{ # a literal {
( # capture the tag name
[^}]+) # everything until the end of the tag (you already had this)
} # a literal }
( # capture the tag's value
.*?) # any characters, but as few as possible to complete the match
# note that the ? makes the repetition ungreedy, which is important if
# you have the same tag twice or more in a string
\{ # a literal {
\1 # use the tag's name again (capture no. 1)
} # a literal }
因此,这使用反向引用\1
来确保结束标记包含与开始标记相同的单词。然后您将在 capture 中找到标签的名称,在 capture 中找到1
标签的值/内容2
。从这里您可以随心所欲地使用这些(例如,将值重新组合在一起)。
请注意,如果您希望标签跨越多行,则应使用SINGLELINE
or选项。DOTALL