我在一个Java项目中发现了一个有趣的正则表达式:"[\\p{C}&&\\S]"
我知道&&
表示“集合交集”,\S
表示“非空格字符”,但\p{C}
是什么,是否可以使用?
java.util.regex.Pattern文档没有提到它。列表中唯一类似的类是\p{Cntrl}
,但它们的行为不同:它们都匹配控制字符,但\p{C}
会对U+FFFF以上的Unicode字符进行两次匹配,如PILE OF POO
:
public class StrangePattern {
public static void main(String[] argv) {
// As far as I can tell, this is the simplest way to create a String
// with code points above U+FFFF.
String poo = new String(Character.toChars(0x1F4A9));
System.out.println(poo); // prints ``
System.out.println(poo.replaceAll("\\p{C}", "?")); // prints `??`
System.out.println(poo.replaceAll("\\p{Cntrl}", "?")); // prints ``
}
}
我在任何地方找到的唯一提及是这里:
\p{C}或\p{Other}: 不可见控制字符和未使用的代码点。
然而,在Java中似乎不存在\p{Other}
,并且匹配的代码点也不是未使用的。
我的Java版本信息:
$ java -version
java version "1.8.0_92"
Java(TM) SE Runtime Environment (build 1.8.0_92-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.92-b14, mixed mode)
额外问题: 原始模式 "[\\p{C}&&\\S]"
的可能意图是什么? 它出现在一种在将字符串发送到电子邮件之前验证字符串的方法中: 如果匹配该模式,则会引发带有消息“无效字符串”的异常。
char
),但是你的控制台可能会将不成对的高代理项显示为?
。使用不同的字符作为替换来查看这一点。 - Marcono1234