gpt4 book ai didi

java - 构建正则表达式 : replacing a number of '?' with an integer equal to the number of '?' s?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:02:26 26 4
gpt4 key购买 nike

我正在尝试构建给定另一个字符串的正则表达式字符串。例如,给定:

*FILE???.LOG

我想要的是用 \w+ 替换字符“*”,用 \w{number of ?} 替换字符 ???强>,即:

\w+FILE\w{3}.LOG

我知道一个简单的 replace() 可以处理“*”。我真正遇到麻烦的是替换 ?。我试图做的是以这样一种方式拆分字符串,以便我能够知道 ? 序列的开始和结束索引。 (例如,我尝试使用的正则表达式之一是 [^\x3F],但在某些情况下,我得到了错误的答案。)

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

我相信这个算法是 O(n) 但我想知道是否有任何方法可以使用正则表达式进行此替换,这会更便宜且更容易实现,或者是否有另一种更有效的方法做这个。

其他例子:

        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}

PS.: 我正在使用 Java

最佳答案

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

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);

参见 IDEONE demo

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

简而言之,(?<q>\\?+)|(?<a>\\*+)正则表达式将问号捕获到“q”组中,将星号捕获到“a”组中。 find()里面,我们检查我们捕获了哪个组,并根据该信息构建结果。

请注意,我假设任何数量的星号都应替换为 \w+ .如果您需要将每个 星号替换为\w+ , 使用 (?<q>\\?+)|(?<a>\\*)正则表达式。

关于java - 构建正则表达式 : replacing a number of '?' with an integer equal to the number of '?' s?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32339093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com