【问题标题】:placeholders for regular expressions正则表达式的占位符
【发布时间】:2019-10-12 20:43:37
【问题描述】:

我对正则表达式还很陌生,但我还不知道如何正确使用它们。 作为输入,我有一个字符串,我想在其中寻找某种模式,让我们说一个包含在!中的单词,就像这样:“你好,我的名字是!John!”。现在我想用不同的东西替换里面的子字符串。我如何在不知道里面有什么的情况下查找子字符串?

String str = "我不知道!怎么做";

str = str.replace("!placeholder!", "X");

就这样。

【问题讨论】:

  • ! 之间的单词重要吗?例如。你可以有多个占位符,并且根据占位符词是什么来选择替换文本?喜欢!A! is better than !B!
  • 不会,不会是任何特殊字符,只是我想大写的字母。

标签: java regex string replace


【解决方案1】:

str.replaceAll("!.*!", "X") 是一种方法。但是,您应该注意许多不同的“占位符”和特殊字符(至少要避开它们)。在这种情况下,我使用. 匹配任何字符,使用* 表示我想要任意数量的字符。该表达式然后读作“替换所有感叹号,后跟任意数量的字符,并以另一个带有字母 X 的感叹号结尾”。

这也将取代感叹号,所以也许你想写str.replaceAll("!.*!", "!X!")。或者,也许您不想替换字符串“!!”所以你会使用“!。+!”。但是要探索所有的可能性,你真的应该阅读一些像这样的教程:https://www.vogella.com/tutorials/JavaRegularExpressions/article.html

【讨论】:

  • .* 太贪心了,如果文中后面有另一个! 就不能正常工作。您可以改用.*?[^!]*。您可能还想使用+ 而不是*,因此不会处理文本中的!!
  • @Andreas True,但由于提出问题的人甚至不知道正则表达式中存在匹配符号,因​​此我想让它尽可能简单。我的解决方案足以满足他提供并回答问题的所有示例。如果您仍然不同意,那么我对您修改答案没有问题。然后我觉得最好的表达方式是\w+?,因为他明确提到里面有一个词。
  • @Andreas 如果您仔细阅读我的回答,我什至会提到!.+!
  • @veprolet 真的很有帮助,谢谢。现在我知道两者之间没有特殊字符,所以我不必担心另一个“!”例如,它只是我想以不同方式大写的字母。
  • @quizz 如果您将使用像 toUpperCase() 这样强大的东西,那么 !.+?! 可能就是您正在寻找的,因为此方法考虑了语言环境并忽略了特殊字符。我很高兴我能提供帮助,但不要忘记将回答您的问题或提供帮助的答案标记为已接受/赞成。它使其他人更容易搜索相关答案......我会从绿色勾号中得到一个匆忙......
【解决方案2】:

也许,

!\w+!\s*

或者,

!\w+!

对于这些示例来说可能工作正常。

Demo

测试

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){

        final String regex = "!\\w+!\\s*";
        final String string = "I don't !know!     how to do this\n"
             + "Hello, my name is !John!           ";
        final String subst = "something_else ";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        final String result = matcher.replaceAll(subst);

        System.out.println(result);

    }
}

输出

I don't something_else how to do this
Hello, my name is something_else

如果您希望简化/修改/探索表达式,在regex101.com 的右上角面板中已对此进行了说明。如果您愿意,您还可以在this link 中观看它如何与一些示例输入匹配。


正则表达式电路

jex.im 可视化正则表达式:

【讨论】:

  • 它应该替换为别的东西,而不是remove,所以你不想在那个正则表达式中包含尾随空格。跨度>