【问题标题】:detect $character java regular expression检测 $character java 正则表达式
【发布时间】:2014-06-29 21:01:14
【问题描述】:

我必须从文本文件中找到像 ${test} 这样的词。并将根据某些标准替换 。在正则表达式中,'$' 具有搜索到行尾的含义。

要检测的正则表达式是什么,例如 ${\w+}。

【问题讨论】:

  • @DavidPostill 我看不出这个问题与这个问题是如何重复的。
  • 如果这类问题包括实际有效(可能是无效)输入的样本,那就更好了。您匹配的文本是否有可能包含非 ASCII 单词字符?例如,如果您的字符串是 "We have seen ${El Niño} hurricanes."

标签: java regex character


【解决方案1】:

您可以尝试使用这个正则表达式

"\\$\\{\\w+\\}"

和方法String#replaceAll(String regex, String replacement):

String s = "abc ${test}def"; // for example
s = s.replaceAll("\\$\\{\\w+\\}", "STACKOVERFLOW");

【讨论】:

  • 我不认为replaceAll 可以解决这个问题,尽管我们无法确定,因为问题规格太少了。我敢打赌,OP 也想将 \w+ 部分用于其他用途,因此常量替换字符串不起作用。
【解决方案2】:

[^}]* 而不是\w+ ?

您可能要考虑使用[^}]* 而不是\w+。前者匹配任何不是右括号的字符,因此它将允许 test-123,而后者将拒绝。当然,这可能正是您想要的。

假设这是原始的正则表达式(查看the demo 中的匹配项):

\$\{[^}]*\}
  • 在 Java 中,我们需要进一步转义反斜杠,生成 \\$\\{[^}]*
  • 同样\$\{\w+\} 必须用作\\$\\{\\w+\}

在 Java 中替换匹配项

String resultString = subjectString.replaceAll("\\$\\{[^}]*\}", "Your Replacement");

在 Java 中遍历匹配项

Pattern regex = Pattern.compile("\\$\\{[^}]*\}");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
       // the current match is regexMatcher.group()
} 

说明

  • \$ 匹配文字 $
  • \{ 匹配左大括号
  • [^}]* 匹配任何不是右大括号的字符
  • \} 右大括号

【讨论】:

  • 我认为您的方法可能最终会成为最好的方法,尽管我想更多地了解 OP 正在尝试做什么,例如查找潜在变量的值是一些 HashMap 或类似的。称我为老式的,但看到最后的闭括号也逃脱了我会更舒服,因为它和开括号一样字面意思。此外,这些是反斜杠而不是斜杠。
  • 感谢您指出backslash 错字。这些未转义的} 让您抽搐......它们是Java 可以接受的,您只需取消转义开头的那个,这样它就不会打开{quantifier}。但是,是的,你是对的,逃避它们更令人赏心悦目。更新。 :)
  • 牙套抽搐是因为以前被这种怪事烧过一次或三次,所以我只是点了我的 i 和交叉我的 t,因为我知道从长远来看它对我有好处,就像吃麸皮一样早餐片。我怀疑这里要解决的原始问题没有被 OP 充分指定,并且用户会希望 \w+ 在捕获组中,以便它可以用于确定替换值的进一步计算,但是 OP 没有真的不多说。如果我们需要真正的输入和输出,那么我们肯定会知道——但事实上,我们不知道。
  • @tchrist 是的,你可能是对的。而穿越 ts 的东西是 Absolut Klar,不知道为什么我没有从那里开始 :)
猜你喜欢
  • 2012-08-16
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 2015-12-29
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
相关资源
最近更新 更多