构建正则表达式:替换一些'?'整数等于'?'的数字?

时间:2015-09-01 19:03:23

标签: java regex string algorithm replace

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

*FILE???.LOG

我想要的是将字符'*'替换为 \ w + ,将字符 ??? 替换为 \ w {number of?} ,即:

\w+FILE\w{3}.LOG

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

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

我相信这个算法是 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

2 个答案:

答案 0 :(得分:1)

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

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+替换任意数量的星号。如果您需要将{em>每个星号替换为\w+,请使用(?<q>\\?+)|(?<a>\\*)正则表达式。

答案 1 :(得分:0)

只需将?替换为\w

例如:

\w+FILE\w\w\w.LOG