print("a".matches("[^[abc]]"));//true why? print("a".matches("[^abc]"));//falseprint("a".matches("[^[abc]]"));//true why??Thank you! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 print("a".matches("[^abc]"));//false //这里的^表示非的意思了. print("a".matches("[^[abc]]"));//true 这里的是把里边的^[abc]当做一个整体了. 经过反复测试发现print("a".matches("[^[abc]]"));//true 这里的^是起到了开关的作用了print("d".matches("[^[abc]d]"));//falseprint("d".matches("[d^[abc]]"));//true这里的^变成了普通的^字符了.print("^".matches("[d^[abc]]"));//true print("a".matches("[^[abc]]"));//true 符合非B,非C的情况,哈哈~ print("a".matches("[^abc]"));//false 表示 任何字符,但除了 a,b,c 所以是false;print("a".matches("[^[abc]]"));//true 表示开头是 a或b或c, 所以是true;不对的地方望指正。 "a".matches("[^abc]"); 表示的是任意一个字符除了a或者b或者c "a".matches("[^[abc]]");//true 第二个我是这么理解的:它表示行起始符^和abc的并集,也就是^或者a或者b或者c.但是[]在jdk文档里描述为字符类匹配,只有行起始符的字符是不存在的,所以满足条件的只有a或者b或者c."d".matches("[d[abc]]")就可以满足为true了,代表一个字符,它为d或者a或者b或者c喵~` 12楼描述有点问题:"它表示行起始符^和abc的并集,也就是^或者a或者b或者c. "应该是"它表示行起始符^和abc的并集,也就是行起始符或者a或者b或者c. "喵~` 按照你说的下面的应该是true ?System.out.println("^a".matches("[^[abc]]"));System.out.println("^".matches("[^[abc]]"));但我刚实验了下,都是false啊。 一个简单的试验: [^] 的效果是 包括在里面的东西都会自动转义 所以 System.out.println("^".matches("[^[abc]]")); 里面的 一对[] 没有特殊含义, 相当与外面的 \[ \]测试一下 System.out.println("[".matches("[^[abc]]")); // false // 把 里面的 [] 都去掉 System.out.println("[".matches("[^abc]")); // true貌似比较明显了 : [^] 里面的 [] 被当成了简单的 字符楼主的列子 误导了大家 对于 [^[abc]] 其实机器的理解是 [^[abc] + ] 匹配第一个字母不是 [ a b c 第二个字母是 ] 的字串试验如下print("a".matches("[^abc]"));//falseprint("a".matches("[^[abc]]"));//true System.out.println("a]".matches("[^[abc]]"));//false 所以 System.out.println("^".matches("[^[abc]]")); 里面的 一对[] 没有特殊含义, 相当与外面的 \[ \] 上面的回答 这一部分有误, 匹配 [ 时需要转义 \[ 而匹配 ] 时不用;System.out.println("]".matches("]"));//true System.out.println("[".matches("\\["));//true System.out.println("[".matches("["));// 运行时报错!~ 有 试验了几次; 有点怀疑 java 中 print("a".matches("[^[abc]]"));//true 这个实现是有误的了。。 在 js 中, 该匹配是失败的http://www.regextester.com/index.html 结果一样的啊 System.out.println("\\^a".matches("[^[abc]]"));//false System.out.println("\\^".matches("[^[abc]]"));//false另:正则表达式确实没看过。 12楼的理解是正确的; 正则表达式 "[^[abc]]" 正确的拆分应该是 最外面的 [] 和里面部分 ^[abc] 故 [^[abc]] 匹配一个非a\b\c 的字符 感觉十楼的不对。[^[abc]]如果理解成是以a或b或c开头的话,那[$[abc]]怎么理解?"a".matches("[$[abc]]") 同样是true 难道理解成$ 后面跟着a或b或c?十八楼的也不对。[ ] 被包括在 [ ]里面并没有成为普通字符。试试"[".matches("[[]");吧。会有错的。 print("a".matches("[^abc]"));//false print("a".matches("[^[abc]]"));//true //表示一行的开头,是abc中的任意一个 我的理解正是如此。"[$[abc]]" 表示结尾是 a或b或c。下面这个是true:System.out.println("casdfsa".matches(".*[$[abc]]"));//true $ 代表一行的结束,一行都结束了,怎么可能后面还跟着a或者b或者c??要表示结尾是a或者b或者c应该是这样才对的啊:[abc]$ "[$[abc]]" 的理解应该是 匹配 $(转义后的$字符) 或 [abc]而 [abc] 又匹配 a b c所以 "[$[abc]]" 匹配 $(相当与外面的 \$) a b c测试如下:System.out.println("d$".matches("d[$[abc]]"));//true // 注 字符串"d$"中的 $ 仅表示$字符, 而非行尾; 有些同学搞混了 System.out.println("da".matches("d[$[abc]]"));//true 另外 对于[] 里面特殊字符转义的问题: 大部分特殊字符如 . () $ + 等在 []内是自动转义的;而如 ^是否自动转义跟它的位置有关; 测试如下:// 测试 . 的自动转义System.out.println("t".matches(".")); //trueSystem.out.println("t".matches("[.]"));//falseSystem.out.println(".".matches("[.]"));//true// 测试 ^ 的转义System.out.println("^".matches("[^[abc]]")); //false 未转义 表示行首System.out.println("^".matches("[[abc^]]")); //true 转义为 ^字符System.out.println("^".matches("[[^abc]]")); //true 未转义 表示非 匹配非abc 的字符System.out.println("a".matches("[[^abc]]")); // false System.out.println("d".matches("[[^abc]]")); // true 还有 [] 中 [ 是打死也不转义; 这个写漏了System.out.println("[".matches("[[]")); // 运行时报错System.out.println("[".matches("[\\[]")); // true 手动转义 print("a".matches("[^abc]"));//false print("a".matches("[^[abc]]"));//truematches后面放的应该是个正则吧?在正则里面^表示开始的意思吧那么第一行matches后面括号里面的意思是一个有3个字母的,不是A,B,C的一个字符第二行的应该代表 开始 必须以(a,b,c)中一个字母为开头的字符串 print("a".matches("[^abc]"));//false print("a".matches("[^[abc]]"));//true 第一个的意思是 a是不是不是abc中的一个 false第二个的意思是 a是不是以abc中的一个字母开头 所以是true 查了JDK "^" 是边界匹配符,表示行的开始 print("a".matches("[^[abc]]"));//true 这里的是把里边的^[abc]当做一个整体了. ("[^[abc]]")表示是以最前面的字母开头的意思,要是以("[[^abc]]")这种形式出现的话,就表示除去a b c以外的字母. 发现有很多人信口开河 根本不经过实验就乱说第二个随便实验一下就知道 根本不是以abc中的一个开头的意思 是只能包含其中一个 看看源码就知道怎么回事了 // Pattern.java中的 private CharProperty clazz(boolean consume) { CharProperty prev = null; CharProperty node = null; BitClass bits = new BitClass(); boolean include = true; boolean firstInClass = true; int ch = this.next(); for (;;) { switch (ch) { case '^': // Negates if first char in a class, otherwise literal if (firstInClass) { if (this.temp[this.cursor - 1] != '[') break; ch = this.next(); include = !include; continue; } else { // ^ not first in class, treat as literal break; } case '[': firstInClass = false; node = this.clazz(true); // 遇到[就递归处理,所以[^[abc]] 相当于[abc] // [^a[^abc]],相当于[^a]&[^abc] if (prev == null) prev = node; else prev = union(prev, node); ch = this.peek(); continue; case '&': .....注意里面的 case '[': 处理测试一下: System.out.println(Pattern.matches("[^abc]", "a")); // false System.out.println(Pattern.matches("[^[abc]]", "a")); // true System.out.println(Pattern.matches("[^[^[abc]]]", "a")); //true System.out.println(Pattern.matches("[^a[^abc]]", "a")); // false System.out.println(Pattern.matches("[^a[^abc]]", "b")); // true System.out.println(Pattern.matches("[[^a]&[^abc]]", "a")); // false System.out.println(Pattern.matches("[[^a]&[^abc]]", "b")); // true 对于[] 就是将abc 看做一个整体来匹配 只有当"abc" 时才会 true 而你的第一个 "a" "ab" "abc" "abc……" 匹配返回的都是 true print("a".matches("[^abc]"));//false print("a".matches("[^[abc]]"));//true 要理解方括号的含义啊方括号就是表示多选一,而且只能选择方括号的一个数字print("a".matches("[^abc]"));要么不是a,要么是b,再或者是c 只能三种情况啊 显然返回false啊print("a".matches("[^[abc]]"));要么不是a,要么不是b,再或者不是c 只能这三种情况 a符合第二种,第三种情形啊 显然返回true啊 Unrecognized SSL message, plaintext connection? 参数里经常出现 (A[]...) 这是什么意思 求助oracle创建java的jdbc存储过程问题。 c# java程序怎么部署 新手问 JBuilder 使用方面的问题 关于多线程中死锁的问题 请问这两个函数是什末意思来者有分! 请问想遍一个麻将程序要用到什么算法? 数据库使用实体Bean还是会话Bean? select 传值问题 为什么我的jc就是运行不出结果呢
print("a".matches("[^[abc]]"));//true 这里的^是起到了开关的作用了print("d".matches("[^[abc]d]"));//false
print("d".matches("[d^[abc]]"));//true这里的^变成了普通的^字符了.print("^".matches("[d^[abc]]"));//true
符合非B,非C的情况,哈哈~
第二个我是这么理解的:
它表示行起始符^和abc的并集,也就是^或者a或者b或者c.
但是[]在jdk文档里描述为字符类匹配,只有行起始符的字符是不存在的,所以满足条件的只有a或者b或者c.
"d".matches("[d[abc]]")就可以满足为true了,代表一个字符,它为d或者a或者b或者c喵~`
"它表示行起始符^和abc的并集,也就是^或者a或者b或者c. "
应该是
"它表示行起始符^和abc的并集,也就是行起始符或者a或者b或者c. "
喵~`
按照你说的
下面的应该是true ?
System.out.println("^a".matches("[^[abc]]"));
System.out.println("^".matches("[^[abc]]"));
但我刚实验了下,都是false啊。
[^] 的效果是 包括在里面的东西都会自动转义 所以 System.out.println("^".matches("[^[abc]]")); 里面的 一对[] 没有特殊含义, 相当与外面的 \[ \]测试一下 System.out.println("[".matches("[^[abc]]")); // false
// 把 里面的 [] 都去掉
System.out.println("[".matches("[^abc]")); // true貌似比较明显了 : [^] 里面的 [] 被当成了简单的 字符
楼主的列子 误导了大家
对于 [^[abc]] 其实机器的理解是 [^[abc] + ] 匹配第一个字母不是 [ a b c 第二个字母是 ] 的字串
试验如下
print("a".matches("[^abc]"));//false
print("a".matches("[^[abc]]"));//true
System.out.println("a]".matches("[^[abc]]"));//false
所以 System.out.println("^".matches("[^[abc]]")); 里面的 一对[] 没有特殊含义, 相当与外面的 \[ \] 上面的回答 这一部分有误, 匹配 [ 时需要转义 \[ 而匹配 ] 时不用;System.out.println("]".matches("]"));//true System.out.println("[".matches("\\["));//true
System.out.println("[".matches("["));// 运行时报错!~
有点怀疑 java 中
print("a".matches("[^[abc]]"));//true
这个实现是有误的了。。
在 js 中, 该匹配是失败的http://www.regextester.com/index.html
结果一样的啊 System.out.println("\\^a".matches("[^[abc]]"));//false
System.out.println("\\^".matches("[^[abc]]"));//false
另:正则表达式确实没看过。
故 [^[abc]] 匹配一个非a\b\c 的字符
"a".matches("[$[abc]]") 同样是true 难道理解成$ 后面跟着a或b或c?十八楼的也不对。
[ ] 被包括在 [ ]里面并没有成为普通字符。
试试"[".matches("[[]");吧。
会有错的。
print("a".matches("[^[abc]]"));//true //表示一行的开头,是abc中的任意一个
我的理解正是如此。"[$[abc]]" 表示结尾是 a或b或c。下面这个是true:System.out.println("casdfsa".matches(".*[$[abc]]"));//true
$ 代表一行的结束,一行都结束了,怎么可能后面还跟着a或者b或者c??要表示结尾是a或者b或者c应该是这样才对的啊:[abc]$
而 [abc] 又匹配 a b c
所以 "[$[abc]]" 匹配 $(相当与外面的 \$) a b c测试如下:
System.out.println("d$".matches("d[$[abc]]"));//true // 注 字符串"d$"中的 $ 仅表示$字符, 而非行尾; 有些同学搞混了
System.out.println("da".matches("d[$[abc]]"));//true
另外 对于[] 里面特殊字符转义的问题: 大部分特殊字符如 . () $ + 等在 []内是自动转义的;
而如 ^是否自动转义跟它的位置有关; 测试如下:
// 测试 . 的自动转义
System.out.println("t".matches(".")); //true
System.out.println("t".matches("[.]"));//false
System.out.println(".".matches("[.]"));//true
// 测试 ^ 的转义
System.out.println("^".matches("[^[abc]]")); //false 未转义 表示行首
System.out.println("^".matches("[[abc^]]")); //true 转义为 ^字符System.out.println("^".matches("[[^abc]]")); //true 未转义 表示非 匹配非abc 的字符
System.out.println("a".matches("[[^abc]]")); // false
System.out.println("d".matches("[[^abc]]")); // true
System.out.println("[".matches("[\\[]")); // true 手动转义
print("a".matches("[^[abc]]"));//truematches后面放的应该是个正则吧?
在正则里面^表示开始的意思吧那么第一行matches后面括号里面的意思是一个有3个字母的,不是A,B,C的一个字符
第二行的应该代表 开始 必须以(a,b,c)中一个字母为开头的字符串
print("a".matches("[^[abc]]"));//true 第一个的意思是 a是不是不是abc中的一个 false
第二个的意思是 a是不是以abc中的一个字母开头 所以是true
("[^[abc]]")表示是以最前面的字母开头的意思,要是以("[[^abc]]")这种形式出现的话,就表示除去a b c以外的字母.
第二个随便实验一下就知道 根本不是以abc中的一个开头的意思 是只能包含其中一个
private CharProperty clazz(boolean consume) {
CharProperty prev = null;
CharProperty node = null;
BitClass bits = new BitClass();
boolean include = true;
boolean firstInClass = true;
int ch = this.next();
for (;;) {
switch (ch) {
case '^':
// Negates if first char in a class, otherwise literal
if (firstInClass) {
if (this.temp[this.cursor - 1] != '[')
break;
ch = this.next();
include = !include;
continue;
} else {
// ^ not first in class, treat as literal
break;
}
case '[':
firstInClass = false;
node = this.clazz(true); // 遇到[就递归处理,所以[^[abc]] 相当于[abc]
// [^a[^abc]],相当于[^a]&[^abc]
if (prev == null)
prev = node;
else
prev = union(prev, node);
ch = this.peek();
continue;
case '&':
.....注意里面的 case '[': 处理测试一下: System.out.println(Pattern.matches("[^abc]", "a")); // false
System.out.println(Pattern.matches("[^[abc]]", "a")); // true
System.out.println(Pattern.matches("[^[^[abc]]]", "a")); //true
System.out.println(Pattern.matches("[^a[^abc]]", "a")); // false
System.out.println(Pattern.matches("[^a[^abc]]", "b")); // true
System.out.println(Pattern.matches("[[^a]&[^abc]]", "a")); // false
System.out.println(Pattern.matches("[[^a]&[^abc]]", "b")); // true
而你的第一个 "a" "ab" "abc" "abc……" 匹配返回的都是 true
print("a".matches("[^abc]"));//false
print("a".matches("[^[abc]]"));//true
要理解方括号的含义啊
方括号就是表示多选一,而且只能选择方括号的一个数字
print("a".matches("[^abc]"));要么不是a,要么是b,再或者是c 只能三种情况啊 显然返回false啊
print("a".matches("[^[abc]]"));要么不是a,要么不是b,再或者不是c 只能这三种情况 a符合第二种,第三种情形啊 显然返回true啊