Patternjava文档练习
变量
CANON_EQ 没太懂他的意思,感觉就是在compile中指定的话,会使一些字符相等,可能是正则相等,如果不指定的话,就是严格相等才行。这是现在的理解,查不到比较好的答案。只能自己猜一猜
CASE_INSENSITIVE
COMMENTS 是对compile中的字符生效,空格会被忽略,#xxx\n这样会被忽略
DOTALL
LITERAL效果和r类似,但是r是取消了\的转译作用,而LITERAL是把\W之类的变为了普通的字符,没有匹配所有字母的作用了
MULTILINE 如果设置了这个变量,就会把\n作为每行的分割,否则,会把一整段看成一行
UNICODE_CASE搞不懂什么意思
UNICODE_CHARACTER_CLASS 也搞不懂。。。
上面这两个暂时看不懂。先放着
UNIX_LINES 和DOTALL很类似,DOTALL是把\r和\n都进行匹配,也就是匹配任何字符,而UNIX_LINES则是匹配除了\n以外的任何字符
关于变量,这篇博客可以作为参考
JDK之Pattern类探索(一)
方法
asMatchPredicate() 返回的Predicate< String >对象的test(str)方法,相当于p.matcher(str).matches()
asPredicate() 返回的Predicate< String > 对象的test(str)方法,相当于p.matcher(str).find()
compile()
flags()返回的是指定的flag的值之和,比如指定了COMMENTS(4)和CASE_INSENSITIVE(2)则flags()返回6
matcher()
matches() 相当于p.matcher().matches()
pattern()返回compile编译的字符串,然后\w会变成\w,(?i)会保留
quote()返回的字符串,用来compile后,效果和设置了Pattern.LITERAL一样
toString()和pattern()返回值很像
如何以?x的形式启动以上变量
compile("(?i)(?x)a");
如何同时设置多个变量
Pattern.CASE_INSENSITIVE|Pattern.MULTILINE
import java.util.regex.*;
import java.util.*;
import java.util.function.*;
import java.util.stream.*;
public class Test
{
public static void main(String[] args) throws Exception
{
//Pattern
//变量
System.out.println(Pattern.CANON_EQ);
System.out.println(new String("a\u030A"));
System.out.println((char)'\u030A');
System.out.println((char)'\u00E5');
Pattern p = Pattern.compile("a\u030A");
Matcher m = p.matcher("\u00E5");
System.out.println(m.matches());
p = Pattern.compile("a",Pattern.CASE_INSENSITIVE);
m = p.matcher("A");
System.out.println(m.matches());
p = Pattern.compile("#AA \n a #abb",Pattern.COMMENTS);
m = p.matcher("a");
System.out.println(m.matches());
p = Pattern.compile("a.*b",Pattern.DOTALL);
m = p.matcher("acsd\ngb");
System.out.println(m.matches());
p = Pattern.compile("\\w",Pattern.LITERAL);
m = p.matcher("\\w");
System.out.println(m.matches());
p = Pattern.compile("^\\d+");
m = p.matcher("a123456789");
System.out.println(m.find());
p = Pattern.compile("\\d$");
m = p .matcher("a123456789b");
System.out.println(m.find());
p = Pattern.compile("^\\d+",Pattern.MULTILINE);
m = p.matcher("123aaa\n456bbb\ncc555");
while(m.find())
{
System.out.println(m.group());
}
p = Pattern.compile("a",Pattern.UNICODE_CASE);
m = p.matcher("A");
System.out.println(m.matches());
p = Pattern.compile("a",Pattern.UNICODE_CHARACTER_CLASS|Pattern.CASE_INSENSITIVE);
m = p.matcher("A");
System.out.println(m.matches());
p = Pattern.compile(".+");
m = p.matcher("aaa\rbbb");
int i = 0;
while(m.find())
{
i++;
System.out.println("group("+i+"):"+m.group());
}
System.out.println();
//UNIX_LINES
p = Pattern.compile(".+",Pattern.UNIX_LINES);
m = p.matcher("aaa\rbbb");
i = 0;
while(m.find())
{
i++;
System.out.println("group("+i+"):"+m.group());
//这里其实应该输出"group(1):aaa\rbbb"但是因为\r把光标移动到本行最左边
//所以导致了输出变成"bbbup(1):aaa", 这也说明了在Pattern.UNIX_LINES模式下
//匹配的是整个aaa\rbbb ,而没有设置Pattern.UNIX_LINES模式的情况,
//会把\r当成分隔符,不匹配。很类似DOTALL
}
p = Pattern.compile(".+",Pattern.UNIX_LINES);
m = p.matcher("aaa\rbbb");
System.out.println(m.matches());
System.out.println("ccc\n\r99");
System.out.println("DOTALL");
p = Pattern.compile(".+",Pattern.DOTALL);
m = p.matcher("aaa\nbbb");
i = 0;
while(m.find())
{
System.out.println("group("+i+"):"+m.group());
}
System.out.println("UNIX_LINES");
p = Pattern.compile(".+",Pattern.UNIX_LINES);
m = p.matcher("aaa\nbbb");
i = 0;
while(m.find())
{
System.out.println("group("+i+"):"+m.group());
}
System.out.println("\u0041");
p = Pattern.compile("A",Pattern.UNICODE_CASE);
m = p.matcher("\u0041");
System.out.println(m.matches());
p = Pattern.compile("\\p{Lower}",Pattern.UNICODE_CHARACTER_CLASS);
m = p.matcher("aaAB");
while(m.find())
{
System.out.println(m.group());
}
p = Pattern.compile("aa");
Predicate<String> pre = p.asMatchPredicate();
System.out.println(pre.test("aac"));
p = Pattern.compile("aa");
pre = p.asPredicate();
System.out.println(pre.test("aac"));
p = Pattern.compile("(?x)(?i)a # asdfa");
m = p.matcher("A");
System.out.println(m.matches());
System.out.println(p.flags());
System.out.println(Pattern.COMMENTS);
System.out.println(Pattern.CASE_INSENSITIVE);
System.out.println(Pattern.DOTALL);
System.out.println(Pattern.LITERAL);
System.out.println(Pattern.MULTILINE);
System.out.println(Pattern.UNICODE_CASE);
System.out.println(Pattern.UNICODE_CHARACTER_CLASS);
System.out.println(Pattern.UNIX_LINES);
System.out.println(Pattern.matches("(?i)a","A"));
p = Pattern.compile("(?i)666\\w+");
System.out.println(p.pattern());
System.out.println(Pattern.quote("\\w\\d\\D"));
p = Pattern.compile(Pattern.quote("\\w\\d"));
m = p.matcher("\\w\\d");
System.out.println(m.matches());
String str = "a1b2c3d4e5";
p = Pattern.compile("\\d");
System.out.println(Arrays.toString(p.split(str)));
p = Pattern.compile("\\D");
System.out.println(Arrays.toString(p.split(str)));
p = Pattern.compile("\\d");
System.out.println(Arrays.toString(p.split(str,2)));
Stream<String> stream = p.splitAsStream(str);
stream.forEach((s) -> System.out.println(s));
p = Pattern.compile("(?i)aaa\\d\\w");
System.out.println(p.toString());
}
}