我正在尝试使用另一个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 。
答案 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