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

use regex in java with non printable chars

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

正则表达式是

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

我想知道如何更改它以匹配包含不可打印字符而不是点 (.) 的域?

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

提前致谢

你的点在这里被转义了。

您需要删除双转义符 (\) 并将点替换为文字以匹配它。

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

。将匹配任何单个字符,无论它是否可打印。您当前的群组 [A-Za-z0-9-] 限制了它。您可以将其更改为 "any character except literal dot"... 即 [^.].

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).