在java中使用带有不可打印字符的正则表达式

时间:2015-08-12 10:53:31

标签: java regex string pattern-matching

我正在使用此处的正则表达式(link)来提取工作正常的域字符串。

正则表达式

^((?!-)[A-Za-z0-9-]{1,63}(?<!-)\\.)+[A-Za-z]{2,6}$

我想知道,我怎么能改变它以匹配包含不可打印字符而不是点(。)的域?

我知道正则表达式代码类似于\ x01,\ x02等。 但如果我用其中一个替换点,则正则表达式不再匹配

提前致谢

2 个答案:

答案 0 :(得分:0)

你的点在这里被转义了。

您需要删除双重转义(\\)并用文字替换该点以匹配它。

您也可以删除双重转义并保留点,这将匹配任何字符。

答案 1 :(得分:0)

。将匹配任何单个字符,无论它是否可打印。您当前的小组[A-Za-z0-9-]限制它。您可以将其更改为“除文字点之外的任何字符”...即[^。]。

Pattern regex = Pattern.compile("^((?!-)[^.]{1,63}(?<!-)\\.)+[A-Za-z]{2,6}$");
System.out.println(regex.matcher("\u0001\u0002\u0003\u0004..com").find()); // => false
System.out.println(regex.matcher("\u0001\u0002\u0003\u0004.com").find()); // => true
System.out.println(regex.matcher("google.com").find()); // => true

如果您尝试验证IDN(国际域名)的用户输入,请注意,new gTLDs包含非字母数字字符 例如.شبكة(.network)。

相关问题