在Java中使用变量创建正则表达式

时间:2016-06-16 00:26:54

标签: java regex string replace

我对正则表达式有点新鲜。我试图在Java中创建一个带有变量的正则表达式。

我想匹配“var”,“(var)”,“[var]”或“{var}”以及变量var的任何案例变体。

我试过这个,似乎有一个例外:
java.util.regex.PatternSyntaxException: Unclosed character class near index 20

有没有人有任何建议如何修复和改进?

String s = "[Tom] The rest of the title";
String v = "Tom";

s = s.replaceAll("(?i)[({/[]*" + v + "[)}\]]*", "");
System.out.println(s);

2 个答案:

答案 0 :(得分:1)

匹配大括号(to),{to}等对正则表达式会很混乱,因为这种关系不是内置于语言中的。一个naieve解决方案将是:

String s = "[Tom] The rest of the title (TOM] tom";
String v = "Tom";
Pattern p = Pattern.compile("\\(" + v + "\\)|\\{" + v + "\\}|\\[" + v + "\\]|(?![{(\\[])" + v + "(?![})\\]])", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(s);
System.out.println('\'' + m.replaceAll("") + '\'');
// ' The rest of the title (TOM] '

Java中正则表达式的首要部分是你需要双重转义任何带有\\的文字字符,因为你需要一个文字反斜杠字符出现在您传递给正则表达式编译器的字符串。

答案 1 :(得分:1)

尝试:

String s = "[Tom] The rest of the title";
String v = "Tom";

String myRegexp = String.format("(?i)\\[%s\\]|\\{%s\\}|\\(%s\\)|%s", v,v,v,v);
System.out.println(myRegexp);

s = s.replaceAll(myRegexp, "");
System.out.println(s);

这一行:

String myRegexp = String.format("(?i)\\[%s\\]|\\{%s\\}|\\(%s\\)|%s", v,v,v,v);

构建一个简单的正则表达式:  (?i)\[Tom\]|\{Tom\}|\(Tom\)|Tom

所有大括号:{}[]()是正则表达式中的特殊字符,它们必须由\字符转义(在Java字符串中必须为\\)。