正则表达式Java错误

正则表达式Java错误,java,regex,Java,Regex,我无法在Java上运行此正则表达式: String regex = "/^{m:\"(.*)\",s:([0-9]{1,15}),r:([0-9]{1,15}),t:([0-9]{1,2})}$/"; String data = "{m:\"texttexttext\",s:1231,r:23123,t:1}"; Pattern p = Pattern.compile(regex_Write_clientToServer); Matcher a = p.matcher(data); 这与

我无法在Java上运行此正则表达式:

 String regex = "/^{m:\"(.*)\",s:([0-9]{1,15}),r:([0-9]{1,15}),t:([0-9]{1,2})}$/";

String data = "{m:\"texttexttext\",s:1231,r:23123,t:1}";
Pattern p = Pattern.compile(regex_Write_clientToServer);

Matcher a = p.matcher(data);

这与regex站点的测试仪上的regex和数据相同,工作正常

有两个问题:

正斜杠不是模式本身的一部分,不应该包括在内。 您需要在开始和结束处转义大括号,否则它们将被视为重复量词。在其他正则表达式实现中可能不是这样,但在Java中肯定是这样——当我尝试删除斜杠时,Pattern.compile中出现了一个异常。 试试这个:

String regex="^\\{m:\"(.*)\",s:([0-9]{1,15}),r:([0-9]{1,15}),t:([0-9]{1,2})\\}$";
String regex = "^\\{m:\"(.*)\",s:([0-9]{1,15}),r:([0-9]{1,15}),t:([0-9]{1,2})\\}$";
这适用于您的示例数据

另一方面,如果这是为了解析JSON,我个人不会尝试使用正则表达式—而是使用真正的JSON解析器。从长远来看,它将更加灵活。

两个问题:

在java中,与perl不同,etc正则表达式不使用/字符包装 您必须转义{文字: 试试这个:

String regex="^\\{m:\"(.*)\",s:([0-9]{1,15}),r:([0-9]{1,15}),t:([0-9]{1,2})\\}$";
String regex = "^\\{m:\"(.*)\",s:([0-9]{1,15}),r:([0-9]{1,15}),t:([0-9]{1,2})\\}$";
两件事: Java不需要任何类型的开始/结束字符,因此可以删除/chars

此外,如果要匹配任何正则表达式元字符,Java要求您转义它们。在您的情况下,大括号字符“{”和“}”前面需要有双反斜杠,一个用于Java转义,一个用于正则表达式转义:

"^\\{m:\"(.*)\",s:([0-9]{1,15}),r:([0-9]{1,15}),t:([0-9]{1,2})\\}$"

事实上,如果大括号不能被误解为{m,n}的一部分,那么你不需要逃避大括号量词。不过,可能最好还是这样做以避免混淆。@TimPietzcker:是的,你会这样做-否则你会在Pattern.compile中遇到异常。我之所以知道这一点,是因为我在没有转义的情况下尝试了它,并在异常中收到索引0附近的非法重复:哦,很有趣。那是Java的一个特长。其他正则表达式不要把它当作字面意思。