Java 构建正则表达式:替换多个'';整数等于'';s

Java 构建正则表达式:替换多个'';整数等于'';s,java,regex,string,algorithm,replace,Java,Regex,String,Algorithm,Replace,我试图在给定另一个字符串的情况下构建一个正则表达式字符串。例如,假设: *FILE???.LOG 我想用\w+替换字符“*”,用\w{number of?}替换字符?,即: \w+FILE\w{3}.LOG 我知道一个简单的replace()可以处理'*'。我真正遇到的问题是更换?。 我试图做的是以这样一种方式拆分字符串,即我能够知道?序列的开始和结束索引。(例如,我尝试使用的一个正则表达式是[^\x3F],但在某些情况下,我得到了错误的答案。) 现在我用蛮力替换它,检查每个角色是否是问号。

我试图在给定另一个字符串的情况下构建一个正则表达式字符串。例如,假设:

*FILE???.LOG
我想用\w+替换字符“*”,用\w{number of?}替换字符,即:

\w+FILE\w{3}.LOG
我知道一个简单的replace()可以处理'*'。我真正遇到的问题是更换。 我试图做的是以这样一种方式拆分字符串,即我能够知道序列的开始和结束索引。(例如,我尝试使用的一个正则表达式是[^\x3F],但在某些情况下,我得到了错误的答案。)

现在我用蛮力替换它,检查每个角色是否是问号。如果不是,我只是将该字符附加到一个新字符串中。如果是,我开始计算问号序列的长度,直到序列结束。当它这样做时,我将\w{number of?}附加到新字符串中,依此类推。在算法的末尾,我的输出是一个按我想要的方式格式化的新字符串

我相信这个算法是O(n),但我想知道是否有任何方法可以使用regex进行替换,这将更便宜、更容易实现,或者是否有其他更有效的方法来实现这一点

其他例子:

        INPUT       ||          OUTPUT 
------------------------------------------------------
??FILE.L???         ||     \w{2}FILE.L\w{3}
??plugin??.L*       ||     \w{2}plugin\w{2}.L\w+
plugin.L??          ||     plugin.L\w{2}
monitor???.???      ||     monitor\w{3}.\w{3}
pl???ugin??*.L???   ||     plu\w{3}ugin\w{2}\w+.L\w{3}
*???.L?             ||     \w+\w{3}.L\w{1}

注:我正在使用Java

只需将每个
替换为
\w

例:


以下是使用一个正则表达式实现两种替换的方法:

String fileText = "pl???ugin??*.L???";
String pattern = "(?<q>\\?+)|(?<a>\\*+)";

Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(fileText);

StringBuffer sb = new StringBuffer();
while (m.find()) {
    if (m.group("q") != null)
    {
        m.appendReplacement(sb, "\\\\w{" + m.group("q").length() + "}");
    }
    else if (m.group("a") != null) 
    {
        m.appendReplacement(sb, "\\\\w+");
    }
}
m.appendTail(sb); // append the rest of the contents
System.out.println(sb);
String fileText=“pl???ugin???*.L??”;
字符串模式=“(?\ \?+)\;(?)

对于
pl???ugin???*.L???
,结果是
pl\w{3}ugin\w{2}\w+.L\w{3}

简而言之,
(?\?+)|(?\\*+)
正则表达式将问号捕获到组“q”中,将星号捕获到组“a”。在
find()
中,我们检查捕获的组,并基于该信息构建结果


注意我假设任何数量的星号都应该替换为
\w+
。如果需要将每个星号替换为
\w+
,请使用
(?\\?+)|(?\*)
regex.

regex将比for..loop成本更高/效率更低,而且在..loop期间维护regex匹配也同样困难。请查看@Stribizev的答案,它比for..loop问号计数器复杂还是不复杂?的确,@LouisRicci…我会查看它。谢谢你的回答!谢谢,@Stribizev!这正是我所需要的!一点也不需要,多亏了我,向上投票和接受答案已经是一百万了。这是一个非常合理的答案。得到的正则表达式字符串可能更大,但编译后的正则表达式无论使用\w\w还是\w{3}都会运行相同的结果。实现的简单性——返回s.replace(“*”,“\\w+”)。replace(“?”,”\\w“)--轻松获胜。
String fileText = "pl???ugin??*.L???";
String pattern = "(?<q>\\?+)|(?<a>\\*+)";

Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(fileText);

StringBuffer sb = new StringBuffer();
while (m.find()) {
    if (m.group("q") != null)
    {
        m.appendReplacement(sb, "\\\\w{" + m.group("q").length() + "}");
    }
    else if (m.group("a") != null) 
    {
        m.appendReplacement(sb, "\\\\w+");
    }
}
m.appendTail(sb); // append the rest of the contents
System.out.println(sb);