(Java)如何在String.replaceAll()的“replacement”参数中模仿正则表达式?

问题描述 投票:-1回答:1

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

我目前正在使用这种方法

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。

基本上,这个方法告诉程序要做的是“找到机器#000111的行并将该行剥离到000111。

实际输出

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

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

预期产出

代替

username = "omg333444"

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

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

java regex string replace replaceall
1个回答
1
投票

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

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

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

其中,数字在第一组中被隔离。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.