Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取字符串的正则表达式模式?_Java_Regex_Java 11 - Fatal编程技术网

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

Java 如何获取字符串的正则表达式模式?,java,regex,java-11,Java,Regex,Java 11,我的字符串中需要进行大量替换,因此我在想,如果我们可以获得正则表达式,而不是手动替换每个单词,是否有任何方法可以将任何单词替换为“\?”到“?”,示例如下所示,有人能帮我使用正则表达式模式吗 query = query.replaceAll("id\\?", "?"); query = query.replaceAll("name\\?", "?"); query = query.replac

我的字符串中需要进行大量替换,因此我在想,如果我们可以获得正则表达式,而不是手动替换每个单词,是否有任何方法可以将任何单词替换为“\?”到“?”,示例如下所示,有人能帮我使用正则表达式模式吗

    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";
您想将任何以
\?
结尾的字符串替换为单个字符
。在正则表达式中,还需要用另一个斜杠(在Java中为两个斜杠)转义
\
,因为它们都有特殊的含义,因此,匹配
c\?
在Java正则表达式中结束,因为
c\?
在正则表达式中使用Java
\
字符,前4个斜杠字面上匹配,最后两个斜杠一起匹配
\?
字符

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

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

// a b c ? e f ? emp? i ? j
注意,顺序很重要,因为
id\?
会被
替换,甚至在
empid\?
的后缀中也是如此,这不是您想要的,因为第一次替换时,您只会得到
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
Set Set=Set.of(“id”、“name”、“empid”、“value”);
查询=查询
.replaceAll(String.format((%s)\\?),String.join(“|”,set)),“?”;
//a、b、c?EF?我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((\w)+\\\\?)+“,”?”。它将用无效的转义序列(有效的转义序列是\b\t\n\f\r\“\'\\)@KaustubhKhareMake that(\\w)。不起作用,好的,谢谢..我会想出一些简单明了的答案谢谢@saka1029