Java正则表达式通过变量输入和字符串输入给出不同的结果

时间:2019-07-19 02:56:55

标签: java regex

我正在尝试将启用通配符的url转换为正则表达式(Pattern),以便稍后可以将其与通配符的url匹配。

然后我发现,尽管具有相同的字符串值,但使用变量输入(String regex = 'str')会产生与直接字符串输入"regex str"不同的结果。

我在官方文档中找不到这种行为。

String destination = "*.example.com";
String regex = destination.replaceAll("\\.", "\\\\\\\\.");
regex = regex.replaceAll("\\*", "\\.\\*");
System.out.println(regex);                             //this gives ".*\\.example\\.com"

System.out.println(Pattern.matches(regex, "office.example.com"));         //false
System.out.println(Pattern.matches(".*\\.example\\.com", "office.example.com"));  //true

2 个答案:

答案 0 :(得分:1)

我们需要两个'\',因为它在字符串变量定义中。语句regex =“。* \\。example \\。com”,执行该语句后,regex的实际值为“。* \。example \ .com”。因此,您可以更改为destination.replaceAll(“ \\。”,“ \\\\。”)以使其正常工作。

答案 1 :(得分:1)

这里有两种转义:字符串和正则表达式。很容易忘记什么是什么。 replaceAll的使用使事情变得更加困难。

我想你想要

String destination = "*.example.com";
String regex = destination.replace(".", "\\.").replace("*", ".*");

System.out.println(Pattern.matches(regex, "office.example.com"));
System.out.println(Pattern.matches(".*\\.example\\.com", "office.example.com"));