【问题标题】:(Java) How to mimic a regex in the "replacement" argument of String.replaceAll()?(Java) 如何在 String.replaceAll() 的“替换”参数中模拟正则表达式?
【发布时间】:2019-04-02 23:31:12
【问题描述】:

别担心,我不是要你帮我找一个正则表达式!

我目前正在使用该方法

String.replaceAll(String regex, String replacement)

解析一行用户提供的数据并获取用户名。我这样做的方法是剥离除我需要的数据之外的所有内容,然后返回该数据。

让我们假装

String rawTextInput = "Machine# 000111 
                       Password: omg333444"

我希望用户名是机器号。我的方法:

private String getUsername(String rawTextInput) {
    String username = rawTextInput.replaceAll("(.+#\\s\\d{6,6})", "(\\d{6,6})");
    return username;
}

第一个参数 regex (.+#\s\d{6,6}) 正确识别原始输入的第一行 Machine# 000111。

第二个参数/正则表达式(\d{6,6})正确地隔离了我想要的数据,000111。

基本上,此方法告诉程序要做的是“找到带有 Machine# 000111 的行并将该行剥离到 000111。

实际输出

但是,我显然错误地使用了 ReplaceAll() 的第二个参数,因为我得到的是文字正则表达式

username = "(\\d{6,6})"

预期输出

而不是

username = "omg333444"

在这里获取用户名的正确方法是什么?有没有办法在 ReplaceAll() 的 Replacement 参数中模拟正则表达式的存在?

请注意,此示例中的代码块具有重复的“\”字符,因为它们是 IntelliJ IDEA 中的转义字符。

【问题讨论】:

  • .replaceAll("(?s).*#\\s(\\d{6}).*", "$1")?
  • 或者使用Pattern和Matcher; Matcher 有一些方法可以让您获取与正则表达式中带括号的组匹配的文本。
  • 您可以使用 group 来获取对匹配字符串的反向引用。 [这篇文章包含示例和解释。 ][1] : stackoverflow.com/questions/36267354/…

标签: java regex string replace replaceall


【解决方案1】:

IntellIJ 实际上是为替换选项执行此操作的。您可以通过按 Ctrl+R(或您平台上的等效项)并使用它来测试它。

答案是在解析时根据组的位置为组分配一个数字。例如,您当前的正则表达式将被视为一组,因为整个匹配项周围有一组括号。如果您将数字隔离在其自己的单独组中,您将能够在替换中使用它。您的新正则表达式可能如下所示:

.+#\\s(\\d{6,6})

其中,数字在第一组中是孤立的。

然后用它们的位置和前面的$ 表示组。所以你的新替换看起来像这样:

String username = rawTextInput.replaceAll(".+#\\s(\\d{6,6})", "$1");

有关替换字符的更多信息,请访问this thread。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-25
    • 2013-05-27
    • 2023-03-10
    • 2012-02-12
    • 2014-09-09
    • 2010-12-24
    • 1970-01-01
    相关资源
    最近更新 更多