如何获取字符串的正则表达式模式?

How to get regex pattern for the string?

我的字符串中有很多替换需要完成,所以我在想如果我们可以获取正则表达式而不是手动替换每个单词,有什么方法可以用“\?”替换任何单词吗?到“?”,下面显示了示例有人可以帮助我使用正则表达式模式

    query = query.replaceAll("id\?", "?");
    query = query.replaceAll("name\?", "?");
    query = query.replaceAll("empid\?", "?");
    query = query.replaceAll("value\?", "?");

嗯,在 Java 中包含 something\? 的字符串看起来像:

String query = "a b c id\? e f name\? empid\? i value\? j";

您想用单个字符 ? 替换任何以 \? 结尾的字符串。在 Regex 中,您需要用另一个斜杠(在 Java 两个斜杠中)另外转义 \?,因为它们都有特殊含义,因此匹配 c\? 结束在 Java 正则表达式中作为 c\\\?,其中前 4 个斜杠在正则表达式中使用 Java 字面匹配 \ 字符,最后两个斜杠一起 \? 从字面上匹配 ?字符.

考虑到上面的输入,您的代码应该如下所示:

query = query
        .replaceAll("id\\\?", "?")
        .replaceAll("name\\\?", "?")
        .replaceAll("empid\\\?", "?")
        .replaceAll("value\\\?", "?");

// a b c ? e f ? emp? i ? j

注意,顺序很重要,因为即使在 empid\? 的后缀中 id\? 也会被 ? 替换,这不是您想要的,因为第一次替换就结束了最多仅 emp。所以这对我来说更正确:

query = query
        .replaceAll("empid\\\?", "?")
        .replaceAll("id\\\?", "?")
        .replaceAll("name\\\?", "?")
        .replaceAll("value\\\?", "?");

// a b c ? e f ? ? i ? j

您可能想要更改为 [a-z]+(从 az 的小拉丁字母)以匹配所有可能的单词范围:

query = query.replaceAll("\w+\\\?", "?");

// a b c ? e f ? ? i ? j

如果要匹配的单词数量有限,如果单词不是太多,您可能希望使用 | 将它们分开:

query = query
        .replaceAll("(id|name|empid|value)\\\?", "?");

// a b c ? e f ? ? i ? j

... 或使用 SetString#join(delimeter, iterable) 先构建正则表达式,这在要匹配的单词数量较多时很有用:

Set<String> set = Set.of("id", "name", "empid", "value");

query = query
        .replaceAll(String.format("(%s)\\\?", String.join("|", set)), "?");

// a b c ? e f ? ? i ? j

试试这个。

String query = "SELECT * FROM t WHERE id=id? AND name=name? AND empid=empid? AND value=value?";
query = query.replaceAll("\w+\?", "?");
System.out.println(query);

输出:

SELECT * FROM t WHERE id=? AND name=? AND empid=? AND value=?