我如何为此编写正则表达式:
可用列表:"some (123)", "other (1BC)", "new (+++)", " do not match"
用户输入:"(1"
查找带括号和内部文本的子字符串。
但这已经崩溃了
PatternSyntaxException: Unclosed group near index 3
\b(1
^
at java.util.regex.Pattern.error(Pattern.java:1713)
答案 0 :(得分:0)
这是因为您将用户输入(1
直接传递给模式编译器。模式编译器正在使用正则表达式,所以当它试图解释(1
时,它会看到(
并认为它是一个捕获组开放。您需要做的是通过添加(
来逃避\
。现在你想要做到这一点取决于你的设计。您可能只想告诉用户他正在输入正则表达式,或者您可能想要创建自己的函数来逃避正则表达式特殊字符。
答案 1 :(得分:0)
我不确定您的要求,但如果您希望带有括号(your content)
的内容使用类似的内容
(?<=\()(.+?)(?=\))
匹配
123
1BC
+++
答案 2 :(得分:0)
我猜你现在有这样的事情:
String userInput = "(1";
String realPattern = "\\b" + userInput;
// use realPattern
我认为您在使用之前只需要escape输入。
String userInput = "(1";
String escapedInput = Pattern.quote(userInput);
String realPattern = "\\b" + escapedInput;
// use realPattern
如果这不对,请提供预期的输入和输出。
答案 3 :(得分:0)
问题有点模糊,但如果您尝试将用户输入编译为正则表达式,则必须使用:Pattern.quote(String)
来避免此类意外错误,因为用户输入可能包含特殊的正则表达式符号:
String regex = Pattern.quote(input);