我正在构建一个非常简单的模板处理器。它只能替换变量的值。
我想我会先将字符串分解成部分(常量部分和变量引用)。然后我会用相应的值替换所有变量引用。最后,我会将所有部分连接在一起。
为了分解字符串,我需要按以下方式对其进行切片。
像这样的字符串
"UPDATE {ix:tablename} SET value = value + 1 WHERE {ix:column} = {ix:value}"
应该产生以下数组
[
"UPDATE ",
"{ix:tablename}",
" SET value = value + 1 WHERE ",
"{ix:column}",
" = ",
"{ix:value}"
]
我知道这可以通过反复搜索第一个左括号,然后是第一个右括号来完成,aso。但是没有比这更优雅的解决方案(也许是一些正则表达式魔法?)。
最佳答案
你可以通过正则表达式拆分得到你想要的数组:
MyString.split("(?=\\{ix:)|(?<=\\})")
({
和 }
需要转义为 \{
和 \}
是正则表达式中的文字,并且因为它是 Java 字符串,那些 \
需要进一步转义为\\
.)
即展望 {ix:
或向后查找 }
如果找到任何一个,则在该位置拆分。
如果有可能 }
为了在其他情况下有效,我可能会采取不同的方法。
环视
正则表达式的一个经常被遗忘的方面,尤其是在拆分时,是它可以匹配位置,也称为零宽度匹配。
大多数人都熟悉位置匹配,例如 ^
和 \b
,但很少有人熟悉环顾四周,它允许指定临时条件。
当正则表达式只包含位置匹配结构时,尽管匹配中不包含任何字符,正则表达式仍然记录匹配发生的位置——大多数字符串操作只需要一个位置和一个长度,并且长度为 0 仍然允许在指定位置发生拆分(或替换)。
前瞻和后视允许您通过指定子表达式来匹配位置,这些子表达式在字符串中从它们被测试的位置向前(向前)和向后(向后)检查。
在语法术语中,前瞻看起来像 (?=subexpr)
而后视看起来像(?<=subexpr)
.
有否定版本 - 当模式必须失败时才被认为是成功的 - 这是 (?!subexpr)
和 (?<!subexpr)
分别。
Lookarounds 是非捕获的 - 它们的匹配不像标准的 (group)
一样放在反向引用组中,尽管它们可以包含反向引用。
后视限制
Java* 中的 Lookbehinds 有一个限制,即它们不能无限长 - 所以你不能做 (?<=\w+)
但需要使用具有上限的数字量词,例如(?<=\w{1,99}
(*一些正则表达式实现没有此限制;尽管许多有更严格的固定长度限制。)
Lookaheads 没有这样的限制(当然,出于性能原因,您应该将它们限制为仅匹配所需的内容)。
关于java - 模板处理——查找字符串中的变量引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13846188/