【Java】java.util.Pattern详述
来源:互联网 发布:java飞机大战子弹 编辑:程序博客网 时间:2024/05/15 23:47
java.util.Pattern详述
这里完全按照JDK1.8 API文档的顺序来书写。
- 类声明
- 常用正则匹配总结
- 反斜杠、转义和引号
- 字符类
- 行结束符
- 分组和捕获
- Unicode支持
- 与Perl 5比较
- 变量
- 方法
类声明
public final class Patternextends Objectimplements Serializable
一个编译好的正则表达式。正则表达式写成String的形式,在使用之前应该通过编译(compiled)创建Pattern实例,这个实例用来创建可以对任意字符序列进行匹配的Matcher对象,多个Matcher对象使用同一个Pattern实例。
下面是一个典型的例子:
Pattern p = Pattern.compile("a*b");Matcher m = p.matcher("aaaaab");boolean b = m.matches();
注意上面是用Matcher的matches方法进行的匹配。实际上Pattern也有一个matches方法,可以实现与上面的例子相同的效果。但是如果这样用,那么Pattern就不能便捷地重用了。Pattern实例是不可变的,并且支持并发和多线程安全,而Matcher就不是这样。
boolean b = Pattern.matches("a*b", "aaaaab");
常用正则匹配总结
- 字符转义
- 字符类
- 预定义的字符类
- POSIX 字符类 (仅US-ASCII)
- java.lang.Character 类 (简单的 java 字符类型)
- 用于 Unicode 脚本(script)、 块、 类别和二进制属性的类
- 定位匹配
- 换行符匹配
- 贪婪匹配
- 不情愿匹配(尽量不贪婪)
这个匹配和贪婪匹配的匹配规则一样,但是希望匹配次数尽可能少
- 强匹配(更加贪婪)
这个匹配和贪婪匹配的匹配规则一样,但是希望匹配次数尽可能多
- 逻辑运算
- 反向引用
反向引用允许在同一正则表达式中随后标识以前匹配的子表达式。
- 引用
- 特殊构造(命名组和非捕获组)
反斜杠、转义和引号
“\”反斜杠主要用来转义,上文很多地方都有用到,当匹配符号的时候,尤其有用。比如匹配左大括号写成“{”。但不应该把它用在字母前或者数字前。
在 Java 源代码中的字符串内的反斜杠会根据 Java™ 语言规范被解释为 Unicode 转义符或其他字符转义,故有必要在字符串中用双反斜杠表示正则表达式来保护他们免受Java 字节码编译器错误解释。字符串文字”\b”,例如,匹配单个退格键字符时解释为正则表达式,而”\b”匹配一个字边界。字符串”(hello)”是非法的会导致编译时错误;要匹配的字符串 (hello) 的字符串”\(hello\)”,必须使用。
字符类
字符类可能会包含其他字符类,也可能是并关系或者相交关系。并关系比如[a-dx-z],字符只要在[a-d]或者[x-z]的范围里即可。相交关系比如[a-z&&[x-z]],字符必须同时被包含在两个集中,这里只能匹配x,y或z。
字符类运算符先后顺序,由高到第依次是
注意元字符,当它写成范围时和单独写意义是不一样的。
行结束符
行结束符是一行字符结尾的标记,有这么几种形式。
- 新行行首(‘\n’)
- 回车换行(“\r\n”)
- 单纯回车(‘\r’)
- 新行Unicode字符(‘\u0085’)
- 行分隔符(‘\u2028’)
- 段落分隔符(‘\u2029’)
如果设置了UNIX_LINES模式,那么只有‘\n’被认作是行结束符。
除非设置DOTALL模式,否则任何正则匹配都会忽略行结束符。
默认情况下,正则匹配符号^和
分组和捕获
捕获组是从左到右按照括号先后进行计数的。在表达式((A)(B(C)))中,可以读到四个组。
0号组永远代表整个表达式。
捕获组之所以如此命名,是因为在匹配过程中,每一个被匹配成功的子字符串都会被保存。可能被匹配的子字符串还会在表达式的后面用到,如通过反向引用,在完成匹配操作后从被匹配的子字符中进行检索。
组命名
被捕获组也可以设置一个名字,那这个有名字的捕获组后续被引用时将依据其名字。组名由下列字符组成,但第一个字符必须是字母。
- 大写字母A-Z(‘\u0041’到‘\u005a’)
- 小写字母a-z(‘\u0061’到‘\u007a’)
- 数字0-9(‘\u0030’到‘\u0039’)
命名捕获组仍然会被组号进行编号标记。
这个命名捕获组一定是最近的那个被匹配成功的子字符串。如果这个组遇到了第二次可以匹配的情形,但第二次匹配并未成功,那么组仍旧保留第一次匹配的值。比如字符串“aba”匹配正则(a(b)?)+,它的组二设为b。每一轮匹配开始前所有捕获组都会清空。
如果组前加?或者什么也没加,那意味着这个组匹配的对象不会被捕获,也不会被计数。
Unicode支持
该类是符合级别 1 的 Unicode 技术标准 #18: Unicode 正则表达式,以及 RL2.1 规范的等价物。
Unicode转义字符如\u2014在Java源代码中依照Java™ 语言规范第 3.3 节所述,它可以直接用于正则表达式,因此同样能够从文件中或者键盘上读取到该值。字符串“\u2014”和“\u2014”尽管不同,但编译的时候都是一样的,都是匹配十六进制为0x2014的字符。
Unicode字符在正则表达式中也可以用它的十六进制值表示,即\x{…},比如补充字符U+2011F能够写成\x{2011F}的形式,而不是由两个Unicode转义字符组成的形式\uD840\uDD1F。
Unicode的脚本、块、类别和二进制属性与Perl里的规则相同,都使用\p和\P构造。\p{prop}匹配的是含有prop属性的文本,而\P{prop}匹配的是不含有prop属性的文本。
无论是内部字符类还是外部字符类,都可以使用脚本、块、类别和二进制属性。
脚本或者以Is为前缀,比如IsHiragana;或者使用script关键字(亦或它的简写形式sc),即script=Hiragana or sc=Hiragana。
由Pattern类支持的脚本名称是通过UnicodeScript.forName获取并定义的。
块或者以In为前缀,如InMongolian;或者用block关键字(亦或它的简写blk),即block=Mongolian or blk=Mongolian。
由Pattern类支持的块名称是通过UnicodeBlock.forName获取并定义的。
类别可能会用到Is前缀(可选):\p{L}和\p{IsL}都表示Unicode字符类,和脚本、块相同,也能用关键字general_category(亦或它的简写gc),即general_category=Lu or gc=Lu。
可被支持的类在Unicode标准中由Character类定义。这些类别的名字可能是规范的,也可能不规范。
二进制属性都有Is前缀,比如IsAlphabetic,由Pattern支持的二进制属性有Alphabetic, Ideographic, Letter, Lowercase, Uppercase, Titlecase, Punctuation, Control, White_Space, Digit, Hex_Digit, Join_Control, Noncharacter_Code_Point, Assigned。
下面是预定义的字符类和POSIX字符类,都符合Annex C(我也不晓得是什么),当flag属性设置为UNICODE_CHARACTER_CLASS时兼容Unicode正则表达式。
类别也可以应用像java.lang.Character的方法ismethodname,返回布尔值(弃用的类别除外)。这里也是通过\p{prop}标记来确定prop对于的属性名是否有同名javamethodname。
与Perl5比较
(略)
变量
方法
声明类型 方法名 描述 Predicate< String> asPredicate() 创建谓词用于匹配字符 static Pattern compile(String regex) 将给定的正则表达式进行编译 static Pattern compile(String regex, int flags) 将给定的正则表达式按照flags规则进行编译 int flags() 返回这个pattern的flags值 Matcher matcher(CharSequence input) 创建一个matcher对象用这个pattern匹配input static boolean matches(String regex, CharSequence input) 创建一个matcher对象用给定正则表达式匹配input String pattern() 返回这个pattern类已编译的正则表达式 static String quote(String s) 返回给定s的文本模式,即元字符和转义字符不具有特殊含义,全部被认为是原义字符 String[] split(CharSequence input) 根据这个pattern的匹配结果将input分割 String[] split(CharSequence input, int limit) 根据这个pattern的匹配结果将input分割,limit大于0的话被分割的字符串数量超出limit个时,那数组中最后一个字符串就把剩下的都囊括了,也就不继续分割了。如果小于0,数组为任意长度。如果等于0,数组为任意长度,被分割出的空字符串会被抛弃。 Stream< String> splitAsStream(CharSequence input) 将给定input切成字符串流 String toString() 返回这个pattern的字符串表示形式
参考网址:https://msdn.microsoft.com/zh-cn/library/az24scfc(v=vs.110).aspx
- 【Java】java.util.Pattern详述
- java.util.regex.Pattern
- java.util.regex.Pattern
- java.util.regex.Pattern
- java.util.regex.Pattern
- [Java] 字符串验证--java.util.regex.Pattern
- 正则表达式java.util.regex.Pattern
- 字符串验证--java.util.regex.Pattern
- 【待翻译】java.util.regex.Pattern
- java.util.regex.Pattern类使用
- java.util.regex.Pattern类使用
- 正则表达式 java.util.regex Pattern
- java.util.regex.Pattern类使用
- java.util.regex.Pattern找不到eclipse
- java.util.regex.Pattern类使用
- 转:java.util.regex.Pattern类使用举例
- Java.util.regex中matcher 和pattern的用法
- 详述JAVA IO流
- Struts2.5.2处理json
- React组件的生命周期
- OpenCV官方文档研究(一)Mat
- 16.9.15 C组总结
- bootstrap学习心得 基础篇
- 【Java】java.util.Pattern详述
- 纯虚函数的识别
- MAC Cocos2dx新手学习路程一
- 2015年清华计算机考研复试 机试试题4
- 语音
- 吉布斯采样(Gibbs Sampling)及相关算法
- 历届试题 分糖果
- rocks cluster笔记1——Linux基础
- const int *p和int * const p的区别(常量指针与指向常量的指针)