【问题标题】:Is there an elegant way of doing this using regex?有没有使用正则表达式的优雅方法?
【发布时间】:2014-08-07 15:38:45
【问题描述】:

我需要对字符串中可能出现一次或多次的类似变量的模式进行搜索和替换。我开始做以下工作正常:

String str1 = "Hello $$(var)";
String regex = "$$(var)";
str1.replaceAll(Pattern.quote(regex), " world");

这会正确生成"Hello world"

但我发现这些“变量”可能包含文字字符串,如下所示:

String str2 = "Hello $$(var_AndUniverse)";

所以现在我需要一个解决方案,之前的结果是"Hello world_AndUniverse"

这是一个简单的案例。这些输入的字符串可能有数千个字符长并包含一个或多个变量,每个变量出现一次或多次。

我可以找出使用indexOf() 方法并通过循环遍历整个字符串来创建新字符串的蛮力方法,但我想知道是否有更简单的方法可以使用正则表达式和replaceAll() 方法来做到这一点或者可能是Pattern/Matcher 解决方案。

【问题讨论】:

  • 你可能不想用正则表达式来做这件事。使用 StringBuilder 的正确解析/替换解决方案。
  • 我认为您应该实现自己的解析器。正则表达式和(似乎是)标记不太好。

标签: java regex parsing


【解决方案1】:

以下将通过使用捕获组来捕获 var 之后和结束括号之前的所有内容。

"Hello $$(var) $$(var bar)".replaceAll("\$\$\(var([^\)]*)\)", "world$1");

应该导致:

Hello world world bar

部分正则表达式

  • \$\$\(var: 文字 $$(var
  • ([^\)]*): 捕获组捕获除) 0 次或更多次以外的任何字符。
  • \):文字 )

REY - Test Regex

【讨论】:

  • 太棒了!效果很好。
【解决方案2】:

要查找替换 $$(any text) 的所有序列,您可以使用

"Hello $$(var) $$(foo bar)".replaceAll("\$\$\([^)]+\)", "world");

哪个会打印

Hello world world

这就是你要找的吗?

【讨论】:

  • 我不这么认为。我想用 String str1 = "Hello $$(var) $$(var bar)"; (注意我更改了值)他期望“Hello world world bar”作为结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多