java - 模板处理——查找字符串中的变量引用

标签 java regex string

我正在构建一个非常简单的模板处理器。它只能替换变量的值。

我想我会先将字符串分解成部分(常量部分和变量引用)。然后我会用相应的值替换所有变量引用。最后,我会将所有部分连接在一起。


为了分解字符串,我需要按以下方式对其进行切片。

像这样的字符串

"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/

相关文章:

c - 运行 scanf() 时出错,tute 使用 gets()

c - 在 C 中使用 putchar 和 getchar 删除多个空格

c++ - 如何优化此 Codewars c++ 代码?

java - 使用 apache tika Parser 对象解析 .doc 和 .docx 文件格式的问题

java - Satang api私有(private)http请求

第一行 < 和 "!"的 Java 正则表达式

java - 尝试使用正则表达式 java 返回字符串中的一系列单词

java - 运行特定测试类的maven命令得到org.testng.TestNGException

java - 如何访问 jpql 从托管 bean 中的 ejb 返回的集合

c# - 在满足条件之前查找值