如何获取字符串的正则表达式模式?
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]+
(从 a
到 z
的小拉丁字母)以匹配所有可能的单词范围:
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
... 或使用 Set
和 String#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=?
我的字符串中有很多替换需要完成,所以我在想如果我们可以获取正则表达式而不是手动替换每个单词,有什么方法可以用“\?”替换任何单词吗?到“?”,下面显示了示例有人可以帮助我使用正则表达式模式
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]+
(从 a
到 z
的小拉丁字母)以匹配所有可能的单词范围:
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
... 或使用 Set
和 String#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=?