Java正则表达式包装除了一些给定的字符之外的所有内容

时间:2013-01-14 22:27:34

标签: java regex

我有一个像

这样的字符串
somet3x70rnumb3r5.3.1*@:ch4r5*

我需要使用模式引用*包装不是\Q...\E,星号字符的所有内容,并将*替换为.*。它应该给出这个:

\Qsomet3x70rnumb3r5.3.1\E.*\Q@:ch4r5\E.*

我可以使用字符串遍历,在*(或我指定的任何字符)上拆分,并逐步构建字符串,但是如果可能的话,我想使用正则表达式和Pattern类实用程序。

指定字符?的另一个示例,它将被.替换:

123?4?

应该给出

\Q123\E.\Q4\E.

我正在考虑使用群组,但我需要围绕每个区域的群组,因为每个群组必须被包裹或替换为其他角色。

我的目标是从给定的String创建一个模式String,但只考虑与指定字符匹配的区域并忽略其余区域(即使它包含正则表达式模式)。

2 个答案:

答案 0 :(得分:1)

如果你不担心建造一个单轮班车会更简单。单线可能是可能的,但这将是一个痛苦。相反,我建议你做这样的事情:

str = str.replaceAll("(?<!^)\\*(?!$)", "\\E.*\\Q")
         .replaceAll("(?<!^)\\?(?!$)", "\\E.\\Q");
str = "\\Q" + str + "\\E";

编写起来更简单,也更容易理解。

答案 1 :(得分:1)

这样的东西?

String s = "abc*efg?123";
s = s.replaceAll("([^\\*\\?]+)", "\\\\Q$1\\\\E");
s = s.replaceAll("\\*", ".*");
s = s.replaceAll("\\?", ".");

\Qabc\E.*\Qefg\E.\Q123\E

中的结果