2015-09-01 18 views
1

我想建立一个正则表达式字符串给予另一个字符串。例如,给定:构建一个正则表达式:替换一些'?'整数等于'?'的数目?

*FILE???.LOG 

我想是与替换字符 '*' \ w +和人物???\ w {数}?,即:

\w+FILE\w{3}.LOG 

我知道一个简单的替换()可以采取的 '*' 照顾。我真正遇到的问题是更换。 我试图做的是分裂以这样的方式串,我就能够知道序列的开始和结束索引?。 (例如,我试图使用的正则表达式之一是[^ \ 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

+0

正则表达式比for..loop的成本更低/效率更低,并且在使用循环的同时,如果不是更多,它将会很难维持正则表达式匹配。只需查看@ stribizhev的答案,它是否比循环questionmark计数器更复杂或更简单? –

+0

的确,@LouisRicci ......我会检查一下。谢谢您的回复! –

回答

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+。如果您需要\w+更换每个星号,使用(?<q>\\?+)|(?<a>\\*)正则表达式。

+1

谢谢@stribizhev!那正是我需要的! –

+0

一点都没有,upvoting和接受答案已经是百万多谢我。 –

0

只是\w替换每个?

例:

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

这是一个非常合理的答案。得到的正则表达式字符串可能较大,但无论使用* \ w \ w \ w *还是* \ w {3} *,编译后的正则表达式都会运行相同的正则表达式。实现的简单性 - 返回s.replace(“*”,“\\ w +”)。replace(“?”,“\\ w”) - 胜手不及。 –

相关问题