正则表达式:字符串处理神器
基础知识:
符号 | 说明 |
---|---|
. | 匹配一个字符 |
* | 0 或者n个字符 |
+ | 1个及以上字符 |
? | 1个或者0个 |
^ | 位于[]中表示取反,位于[]外面表示一行的开头 |
$ | 一行的结尾 |
- | 范围 |
I | 或者 |
&& | 且 |
\d | 一个数字,同[0-9] |
\D | 非数字,同[^0-9] |
\s | 空白字符,[ \t\n\x0B\f\r] |
\S | 非空白符 |
\w | 大小写字母和下斜杠,同[a-zA-Z_0-9] |
\W | [^\w] |
\b | 一个单词的边界 |
{n} | 出现n次 |
{n,} | 至少出现n次 |
{n,m} | n到m次 |
[n-m] | n到m中的一个 |
[abc] | abc中的一个 |
[^abc] | 除abc外的任意一个 |
[a-zA-Z] | 大写字母或者小写字母中的一个,同[a-z] |
[a-z&&[eFG]] | 小写字母并且是eFG中的一个 |
常用的正则表达式:
(1) "^\d+$"//非负整数(正整数 + 0)
(2) "^[0-9]*[1-9][0-9]*$"//正整数
(3) "^((-\d+)|(0+))$"//非正整数(负整数 + 0)
(4) "^-[0-9]*[1-9][0-9]*$"//负整数
(5) "^-?\d+$"//整数
(6) "^\d+(\.\d+)?$"//非负浮点数(正浮点数 + 0)
(7) "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"//正浮点数
(8) "^((-\d+(\.\d+)?)|(0+(\.0+)?))$"//非正浮点数(负浮点数 + 0)
(9) "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"//负浮点数
(10) "^(-?\d+)(\.\d+)?$"//浮点数
(11) "^[A-Za-z]+$"//由26个英文字母组成的字符串
(12) "^[A-Z]+$"//由26个英文字母的大写组成的字符串
(13) "^[a-z]+$"//由26个英文字母的小写组成的字符串
(14) "^[A-Za-z0-9]+$"//由数字和26个英文字母组成的字符串
(15) "^\w+$"//由数字、26个英文字母或者下划线组成的字符串
(16) "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"//email地址
(17) "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"//url
(18) /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日
(19) /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年
(20) "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$" //Emil
(21) /^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$/ //电话号码
(22) "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$" //IP地址
(23)
(24) 匹配中文字符的正则表达式: [\u4e00-\u9fa5]
(25) 匹配双字节字符(包括汉字在内):[^\x00-\xff]
(26) 匹配空行的正则表达式:\n[\s| ]*\r
(27) 匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/
(28) 匹配首尾空格的正则表达式:(^\s*)|(\s*$)
(29) 匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
(30) 匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$
(31) 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
(32) 匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})?
(33) 匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$
(34) 元字符及其在正则表达式上下文中的行为:
(35) \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。
(36) ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 ’\n’ 或 ’\r’ 之后的位置。
(37) $ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性,$ 也匹配 ’\n’ 或 ’\r’ 之前的位置。
(38) * 匹配前面的子表达式零次或多次。
(39) + 匹配前面的子表达式一次或多次。+ 等价于 {1,}。
(40) ? 匹配前面的子表达式零次或一次。? 等价于 {0,1}。
(41) {n} n 是一个非负整数,匹配确定的n 次。
(42) {n,} n 是一个非负整数,至少匹配n 次。
(43) {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。
(44) ? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
(45) . 匹配除 "\n" 之外的任何单个字符。要匹配包括 ’\n’ 在内的任何字符,请使用象 ’[.\n]’ 的模式。
(46) (pattern) 匹配pattern 并获取这一匹配。
(47) (?:pattern) 匹配pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。
(48) (?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
(49) (?!pattern) 负向预查,与(?=pattern)作用相反
(50) x|y 匹配 x 或 y。
(51) [xyz] 字符集合。
(52) [^xyz] 负值字符集合。
(53) [a-z] 字符范围,匹配指定范围内的任意字符。
(54) [^a-z] 负值字符范围,匹配任何不在指定范围内的任意字符。
(55) \b 匹配一个单词边界,也就是指单词和空格间的位置。
(56) \B 匹配非单词边界。
(57) \cx 匹配由x指明的控制字符。
(58) \d 匹配一个数字字符。等价于 [0-9]。
(59) \D 匹配一个非数字字符。等价于 [^0-9]。
(60) \f 匹配一个换页符。等价于 \x0c 和 \cL。
(61) \n 匹配一个换行符。等价于 \x0a 和 \cJ。
(62) \r 匹配一个回车符。等价于 \x0d 和 \cM。
(63) \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
(64) \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
(65) \t 匹配一个制表符。等价于 \x09 和 \cI。
(66) \v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
(67) \w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。
(68) \W 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。
(69) \xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。
(70) \num 匹配 num,其中num是一个正整数。对所获取的匹配的引用。
(71) \n 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
(72) \nm 标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
(73) \nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
(74) \un 匹配 n,其中 n 是一个用四个十六进制数字表示的Unicode字符。
(75) 匹配中文字符的正则表达式: [u4e00-u9fa5]
(76) 匹配双字节字符(包括汉字在内):[^x00-xff]
(77) 匹配空行的正则表达式:n[s| ]*r
(78) 匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/
(79) 匹配首尾空格的正则表达式:(^s*)|(s*$)
(80) 匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
(81) 匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?
(82) 利用正则表达式限制网页表单里的文本框输入内容:
(83) 用正则表达式限制只能输入中文:οnkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))"
(84) 用正则表达式限制只能输入全角字符: οnkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))"
(85) 用正则表达式限制只能输入数字:οnkeyup="value=value.replace(/[^d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"
(86) 用正则表达式限制只能输入数字和英文:οnkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"
(87) 整理:
(88) 匹配中文字符的正则表达式: [\u4e00-\u9fa5]
(89) 匹配双字节字符(包括汉字在内):[^\x00-\xff]
(90) 匹配空行的正则表达式:\n[\s| ]*\r
(91) 匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/
(92) 匹配首尾空格的正则表达式:(^\s*)|(\s*$)
(93) 匹配IP地址的正则表达式:/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //
(94) 匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
(95) 匹配网址URL的正则表达式:http://(/[\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
(96) sql语句:^(select|drop|delete|create|update|insert).*$
(97) 非负整数:^\d+$
(98) 正整数:^[0-9]*[1-9][0-9]*$
(99) 非正整数:^((-\d+)|(0+))$
(100) 负整数:^-[0-9]*[1-9][0-9]*$
(101) 整数:^-?\d+$
(102) 非负浮点数:^\d+(\.\d+)?$
(103) 正浮点数:^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
(104) 非正浮点数:^((-\d+\.\d+)?)|(0+(\.0+)?))$
(105) 负浮点数:^(-((正浮点数正则式)))$
(106) 英文字符串:^[A-Za-z]+$
(107) 英文大写串:^[A-Z]+$
(108) 英文小写串:^[a-z]+$
(109) 英文字符数字串:^[A-Za-z0-9]+$
(110) 英数字加下划线串:^\w+$
(111) E-mail地址:^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$
(112) URL:^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$
或:^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$
(113) 邮政编码:^[1-9]\d{5}$
(114) 中文:^[\u0391-\uFFE5]+$
(115) 电话号码:^((\d2,3\d2,3)|(\d{3}\-))?(0\d2,30\d2,3|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$
(116) 手机号码:^((\d2,3\d2,3)|(\d{3}\-))?13\d{9}$
(117) 双字节字符(包括汉字在内):^\x00-\xff
(118) 匹配首尾空格:(^\s*)|(\s*$)(像vbscript那样的trim函数)
(119) 匹配HTML标记:<(.*)>.*<\/\1>|<(.*) \/>
(120) 匹配空行:\n[\s| ]*\r
(121) 提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
(122) 提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
(123) 提取信息中的图片链接:(s|S)(r|R)(c|C) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
(124) 提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)
(125) 提取信息中的中国手机号码:(86)*0*13\d{9}
(126) 提取信息中的中国固定电话号码:(\d3,4\d3,4|\d{3,4}-|\s)?\d{8}
(127) 提取信息中的中国电话号码(包括移动和固定电话):(\d3,4\d3,4|\d{3,4}-|\s)?\d{7,14}
(128) 提取信息中的中国邮政编码:[1-9]{1}(\d+){5}
(129) 提取信息中的浮点数(即小数):(-?\d*)\.?\d+
(130) 提取信息中的任何数字 :(-?\d*)(\.\d+)?
(131) IP:(\d+)\.(\d+)\.(\d+)\.(\d+)
(132) 电话区号:/^0\d{2,3}$/
(133) 腾讯QQ号:^[1-9]*[1-9][0-9]*$
(134) 帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
(135) 中文、英文、数字及下划线:^[\u4e00-\u9fa5_a-zA-Z0-9]+$
在java中使用:
- /**
- * 正则工具类
- * 提供验证邮箱、手机号、电话号码、身份证号码、数字等方法
- */
- public final class RegexUtils {
- /**
- * 验证Email
- * @param email email地址,格式:zhangsan@sina.com,zhangsan@xxx.com.cn,xxx代表邮件服务商
- * @return 验证成功返回true,验证失败返回false
- */
- public static boolean checkEmail(String email) {
- String regex = "\\w+@\\w+\\.[a-z]+(\\.[a-z]+)?";
- return Pattern.matches(regex, email);
- }
- /**
- * 验证身份证号码
- * @param idCard 居民身份证号码15位或18位,最后一位可能是数字或字母
- * @return 验证成功返回true,验证失败返回false
- */
- public static boolean checkIdCard(String idCard) {
- String regex = "[1-9]\\d{13,16}[a-zA-Z0-9]{1}";
- return Pattern.matches(regex,idCard);
- }
- /**
- * 验证手机号码(支持国际格式,+86135xxxx...(中国内地),+00852137xxxx...(中国香港))
- * @param mobile 移动、联通、电信运营商的号码段
- *<p>移动的号段:134(0-8)、135、136、137、138、139、147(预计用于TD上网卡)
- *、150、151、152、157(TD专用)、158、159、187(未启用)、188(TD专用)</p>
- *<p>联通的号段:130、131、132、155、156(世界风专用)、185(未启用)、186(3g)</p>
- *<p>电信的号段:133、153、180(未启用)、189</p>
- * @return 验证成功返回true,验证失败返回false
- */
- public static boolean checkMobile(String mobile) {
- String regex = "(\\+\\d+)?1[3458]\\d{9}$";
- return Pattern.matches(regex,mobile);
- }
- /**
- * 验证固定电话号码
- * @param phone 电话号码,格式:国家(地区)电话代码 + 区号(城市代码) + 电话号码,如:+8602085588447
- * <p><b>国家(地区) 代码 :</b>标识电话号码的国家(地区)的标准国家(地区)代码。它包含从 0 到 9 的一位或多位数字,
- * 数字之后是空格分隔的国家(地区)代码。</p>
- * <p><b>区号(城市代码):</b>这可能包含一个或多个从 0 到 9 的数字,地区或城市代码放在圆括号——
- * 对不使用地区或城市代码的国家(地区),则省略该组件。</p>
- * <p><b>电话号码:</b>这包含从 0 到 9 的一个或多个数字 </p>
- * @return 验证成功返回true,验证失败返回false
- */
- public static boolean checkPhone(String phone) {
- String regex = "(\\+\\d+)?(\\d{3,4}\\-?)?\\d{7,8}$";
- return Pattern.matches(regex, phone);
- }
- /**
- * 验证整数(正整数和负整数)
- * @param digit 一位或多位0-9之间的整数
- * @return 验证成功返回true,验证失败返回false
- */
- public static boolean checkDigit(String digit) {
- String regex = "\\-?[1-9]\\d+";
- return Pattern.matches(regex,digit);
- }
- /**
- * 验证整数和浮点数(正负整数和正负浮点数)
- * @param decimals 一位或多位0-9之间的浮点数,如:1.23,233.30
- * @return 验证成功返回true,验证失败返回false
- */
- public static boolean checkDecimals(String decimals) {
- String regex = "\\-?[1-9]\\d+(\\.\\d+)?";
- return Pattern.matches(regex,decimals);
- }
- /**
- * 验证空白字符
- * @param blankSpace 空白字符,包括:空格、\t、\n、\r、\f、\x0B
- * @return 验证成功返回true,验证失败返回false
- */
- public static boolean checkBlankSpace(String blankSpace) {
- String regex = "\\s+";
- return Pattern.matches(regex,blankSpace);
- }
- /**
- * 验证中文
- * @param chinese 中文字符
- * @return 验证成功返回true,验证失败返回false
- */
- public static boolean checkChinese(String chinese) {
- String regex = "^[\u4E00-\u9FA5]+$";
- return Pattern.matches(regex,chinese);
- }
- /**
- * 验证日期(年月日)
- * @param birthday 日期,格式:1992-09-03,或1992.09.03
- * @return 验证成功返回true,验证失败返回false
- */
- public static boolean checkBirthday(String birthday) {
- String regex = "[1-9]{4}([-./])\\d{1,2}\\1\\d{1,2}";
- return Pattern.matches(regex,birthday);
- }
- /**
- * 验证URL地址
- * @param url 格式:http://blog.csdn.net:80/xyang81/article/details/7705960? 或 http://www.csdn.net:80
- * @return 验证成功返回true,验证失败返回false
- */
- public static boolean checkURL(String url) {
- String regex = "(https?://(w{3}\\.)?)?\\w+\\.\\w+(\\.[a-zA-Z]+)*(:\\d{1,5})?(/\\w*)*(\\??(.+=.*)?(&.+=.*)?)?";
- return Pattern.matches(regex, url);
- }
- /**
- * 匹配中国邮政编码
- * @param postcode 邮政编码
- * @return 验证成功返回true,验证失败返回false
- */
- public static boolean checkPostcode(String postcode) {
- String regex = "[1-9]\\d{5}";
- return Pattern.matches(regex, postcode);
- }
- /**
- * 匹配IP地址(简单匹配,格式,如:192.168.1.1,127.0.0.1,没有匹配IP段的大小)
- * @param ipAddress IPv4标准地址
- * @return 验证成功返回true,验证失败返回false
- */
- public static boolean checkIpAddress(String ipAddress) {
- String regex = "[1-9](\\d{1,2})?\\.(0|([1-9](\\d{1,2})?))\\.(0|([1-9](\\d{1,2})?))\\.(0|([1-9](\\d{1,2})?))";
- return Pattern.matches(regex, ipAddress);
- }
- }
API 文档:
| JavaTM Platform Standard Ed. 6 | |||||||||
上一个类 下一个类 | 框架 无框架 | |||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
java.util.regex
类 Matcher
java.lang.Object java.util.regex.Matcher
-
所有已实现的接口:
- MatchResult
public final class Matcherextends Object implements MatchResult
通过解释 Pattern
对 character sequence
执行匹配操作的引擎。
通过调用模式的 matcher
方法从模式创建匹配器。创建匹配器后,可以使用它执行三种不同的匹配操作:
每个方法都返回一个表示成功或失败的布尔值。通过查询匹配器的状态可以获取关于成功匹配的更多信息。
匹配器在其输入的子集(称为区域)中查找匹配项。默认情况下,此区域包含全部的匹配器输入。可通过 region
方法修改区域,通过 regionStart
和 regionEnd
方法查询区域。区域边界与某些模式构造交互的方式是可以更改的。有关此内容更多的信息,请参阅 useAnchoringBounds
和 useTransparentBounds
。
此类还定义使用新字符串替换匹配子序列的方法,需要时,可以从匹配结果计算出新字符串的内容。可以先后使用 appendReplacement
和 appendTail
方法将结果收集到现有的字符串缓冲区,或者使用更加便捷的 replaceAll
方法创建一个可以在其中替换输入序列中每个匹配子序列的字符串。
匹配器的显式状态包括最近成功匹配的开始和结束索引。它还包括模式中每个捕获组捕获的输入子序列的开始和结束索引以及该子序列的总数。出于方便的考虑,还提供了以字符串的形式返回这些已捕获子序列的方法。
匹配器的显式状态最初是未定义的;在成功匹配导致 IllegalStateException
抛出之前尝试查询其中的任何部分。每个匹配操作都将重新计算匹配器的显式状态。
匹配器的隐式状态包括输入字符序列和添加位置,添加位置最初是零,然后由 appendReplacement
方法更新。
可以通过调用匹配器的 reset()
方法来显式重置匹配器,如果需要新输入序列,则调用其 reset(CharSequence)
方法。重置匹配器将放弃其显式状态信息并将添加位置设置为零。
此类的实例用于多个并发线程是不安全的。
-
从以下版本开始:
- 1.4
方法摘要 | |
---|---|
Matcher | appendReplacement(StringBuffer sb, String replacement) 实现非终端添加和替换步骤。 |
StringBuffer | appendTail(StringBuffer sb) 实现终端添加和替换步骤。 |
int | end() 返回最后匹配字符之后的偏移量。 |
int | end(int group) 返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。 |
boolean | find() 尝试查找与该模式匹配的输入序列的下一个子序列。 |
boolean | find(int start) 重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。 |
String | group() 返回由以前匹配操作所匹配的输入子序列。 |
String | group(int group) 返回在以前匹配操作期间由给定组捕获的输入子序列。 |
int | groupCount() 返回此匹配器模式中的捕获组数。 |
boolean | hasAnchoringBounds() 查询此匹配器区域界限的定位。 |
boolean | hasTransparentBounds() 查询此匹配器区域边界的透明度。 |
boolean | hitEnd() 如果匹配器执行的最后匹配操作中搜索引擎遇到输入结尾,则返回 true。 |
boolean | lookingAt() 尝试将从区域开头开始的输入序列与该模式匹配。 |
boolean | matches() 尝试将整个区域与模式匹配。 |
Pattern | pattern() 返回由此匹配器解释的模式。 |
static String | quoteReplacement(String s) 返回指定 String 的字面值替换 String 。 |
Matcher | region(int start, int end) 设置此匹配器的区域限制。 |
int | regionEnd() 报告此匹配器区域的结束索引(不包括)。 |
int | regionStart() 报告此匹配器区域的开始索引。 |
String | replaceAll(String replacement) 替换模式与给定替换字符串相匹配的输入序列的每个子序列。 |
String | replaceFirst(String replacement) 替换模式与给定替换字符串匹配的输入序列的第一个子序列。 |
boolean | requireEnd() 如果很多输入都可以将正匹配更改为负匹配,则返回 true。 |
Matcher | reset() 重置匹配器。 |
Matcher | reset(CharSequence input) 重置此具有新输入序列的匹配器。 |
int | start() 返回以前匹配的初始索引。 |
int | start(int group) 返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引。 |
MatchResult | toMatchResult() 作为 MatchResult 返回此匹配器的匹配状态。 |
String | toString() 返回匹配器的字符串表示形式。 |
Matcher | useAnchoringBounds(boolean b) 设置匹配器区域界限的定位。 |
Matcher | usePattern(Pattern newPattern) 更改此 Matcher 用于查找匹配项的 Pattern。 |
Matcher | useTransparentBounds(boolean b) 设置此匹配器区域边界的透明度。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
方法详细信息 |
---|
pattern
public Pattern pattern()
- 返回由此匹配器解释的模式。
-
-
返回:
- 为其创建此匹配器的模式。
toMatchResult
public MatchResult toMatchResult()
-
作为
MatchResult
返回此匹配器的匹配状态。该结果不受对此匹配器执行的后续操作的影响。 -
-
返回:
-
具有此匹配器状态的
MatchResult
。
从以下版本开始:
- 1.5
-
具有此匹配器状态的
usePattern
public Matcher usePattern(Pattern newPattern)
-
更改此
Matcher 用于查找匹配项的
Pattern。
此方法可导致匹配器丢失有关最后发生匹配的组的信息。维持了输入中匹配器的位置并且不影响其最后添加的位置。
-
-
参数:
-
newPattern
- 匹配器使用的新模式。
返回:
- 匹配器。 抛出:
-
IllegalArgumentException
- 如果 newPattern 为 null。
从以下版本开始:
- 1.5
-
reset
public Matcher reset()
-
重置匹配器。
重置匹配器将放弃其所有显式状态信息并将其添加位置设置为零。匹配器的区域被设置为默认区域,默认区域就是其整个字符序列。此匹配器的区域边界的定位和透明度都不受影响。
-
-
返回:
- 匹配器。
reset
public Matcher reset(CharSequence input)
-
重置此具有新输入序列的匹配器。
重置匹配器将放弃其所有显式状态信息并将其添加位置设置为零。匹配器的区域被设置为默认区域,默认区域就是其整个字符序列。此匹配器的区域边界的定位和透明度都不受影响。
-
-
参数:
-
input
- 新的输入字符序列。
返回:
- 匹配器。
-
start
public int start()
- 返回以前匹配的初始索引。
-
-
指定者:
-
接口
MatchResult
中的start
-
接口
-
-
返回:
- 第一个匹配字符的索引。 抛出:
-
IllegalStateException
- 如果没有尝试任何匹配,或者以前的匹配操作失败。
start
public int start(int group)
-
返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引。
捕获组是从 1 开始从左到右的索引。组零表示整个模式,因此表达式 m.start(0) 等效于 m.start()。
-
-
指定者:
-
接口
MatchResult
中的start
-
接口
-
-
参数:
-
group
- 此匹配器模式中捕获组的索引。
返回:
- 组捕获的首个字符的索引;如果匹配成功但组本身没有任何匹配项,则返回 -1。 抛出:
-
IllegalStateException
- 如果没有尝试任何匹配,或者以前的匹配操作失败。 -
IndexOutOfBoundsException
- 如果在给定索引的模式中不存在捕获组。
-
end
public int end()
- 返回最后匹配字符之后的偏移量。
-
-
指定者:
-
接口
MatchResult
中的end
-
接口
-
-
返回:
- 最后匹配字符之后的偏移量。 抛出:
-
IllegalStateException
- 如果没有尝试任何匹配,或者以前的匹配操作失败。
end
public int end(int group)
-
返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。
捕获组是从 1 开始从左到右的索引。组零表示整个模式,因此表达式 m.end(0) 等效于 m.end()。
-
-
指定者:
-
接口
MatchResult
中的end
-
接口
-
-
参数:
-
group
- 此匹配器模式中捕获组的索引。
返回:
- 组捕获的最后字符之后的偏移量;如果匹配成功但组本身没有任何匹配项,则返回 -1。 抛出:
-
IllegalStateException
- 如果没有尝试任何匹配,或者以前的匹配操作失败。 -
IndexOutOfBoundsException
- 如果在给定索引的模式中不存在捕获组。
-
group
public String group()
-
返回由以前匹配操作所匹配的输入子序列。
对于具有输入序列 s 的匹配器 m,表达式 m.group() 和 s.substring(m.start(), m.end()) 是等效的。
注意,某些模式(例如,a*)匹配空字符串。当模式成功匹配输入中的空字符串时,此方法将返回空字符串。
-
-
指定者:
-
接口
MatchResult
中的group
-
接口
-
-
返回:
- 以前匹配操作所匹配的字符串形式的子序列(可能为空)。 抛出:
-
IllegalStateException
- 如果没有尝试任何匹配,或者以前的匹配操作失败。
group
public String group(int group)
-
返回在以前匹配操作期间由给定组捕获的输入子序列。
对于匹配器 m、输入序列 s 和组索引 g,表达式 m.group(g) 和 s.substring(m.start(g), m.end(g)) 是等效的。
捕获组是从 1 开始从左到右的索引。组零表示整个模式,因此表达式 m.group(0) 等效于 m.group()。
如果该匹配成功了,但指定组未能匹配输入序列的任何部分,则返回 null。注意,某些组(例如,(a*))匹配空字符串。当这些的组成功匹配输入中的空字符串时,此方法将返回空字符串。
-
-
指定者:
-
接口
MatchResult
中的group
-
接口
-
-
参数:
-
group
- 此匹配器模式中捕获组的索引。
返回:
- 在以前的匹配期间组所捕获的子序列(可能为空);如果组未能匹配输入的部分,则返回 null。 抛出:
-
IllegalStateException
- 如果没有尝试任何匹配,或者以前的匹配操作失败。 -
IndexOutOfBoundsException
- 如果在给定索引的模式中不存在捕获组。
-
groupCount
public int groupCount()
-
返回此匹配器模式中的捕获组数。
根据惯例,零组表示整个模式。它不包括在此计数中。
任何小于等于此方法返回值的非负整数保证是此匹配器的有效组索引。
-
-
指定者:
-
接口
MatchResult
中的groupCount
-
接口
-
-
返回:
- 此匹配器模式中的捕获组数。
matches
public boolean matches()
-
尝试将整个区域与模式匹配。
如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
-
-
返回:
- 当且仅当整个区域序列匹配此匹配器的模式时才返回 true。
find
public boolean find()
-
尝试查找与该模式匹配的输入序列的下一个子序列。
此方法从匹配器区域的开头开始,如果该方法的前一次调用成功了并且从那时开始匹配器没有被重置,则从以前匹配操作没有匹配的第一个字符开始。
如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
-
-
返回:
- 当且仅当输入序列的子序列匹配此匹配器的模式时才返回 true。
find
public boolean find(int start)
-
重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
如果匹配成功,则可通过 start、end 和 group 方法获取更多信息,而
find()
方法的后续调用将从此匹配操作未匹配的第一个字符开始。 -
-
返回:
- 当且仅当从给定索引开始的输入序列的子序列匹配此匹配器的模式时才返回 true。 抛出:
-
IndexOutOfBoundsException
- 如果开始点小于零或大于输入序列的长度。
lookingAt
public boolean lookingAt()
-
尝试将从区域开头开始的输入序列与该模式匹配。
与
matches
方法类似,此方法始终从区域的开头开始;与之不同的是,它不需要匹配整个区域。如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
-
-
返回:
- 当且仅当输入序列的前缀匹配此匹配器的模式时才返回 true。
quoteReplacement
public static String quoteReplacement(String s)
-
返回指定
String
的字面值替换String
。 此方法将生成一个String
,它将用作Matcher
类的appendReplacement
方法中的字面值替换s
。所产生的String
将与作为字面值序列的s
中的字符序列匹配。斜线 ('\') 和美元符号 ('$') 将不具有任何特殊意义。 -
-
参数:
-
s
- 要字面值化的字符串。
返回:
- 字面值字符串替换。 从以下版本开始:
- 1.5
-
appendReplacement
public Matcher appendReplacement(StringBuffer sb, String replacement)
-
实现非终端添加和替换步骤。
此方法执行以下操作:
它从添加位置开始在输入序列读取字符,并将其添加到给定字符串缓冲区。在读取以前匹配之前的最后字符(即位于索引
start()
- 1 处的字符)之后,它就会停止。它将给定替换字符串添加到字符串缓冲区。
它将此匹配器的添加位置设置为最后匹配位置的索引加 1,即
end()
。
替换字符串可能包含到以前匹配期间所捕获的子序列的引用:$g 每次出现时,都将被
group
(g) 的计算结果替换。$ 之后的第一个数始终被视为组引用的一部分。如果后续的数可以形成合法组引用,则将被合并到 g 中。只有数字 '0' 到 '9' 被视为组引用的可能组件。例如,如果第二个组匹配字符串 "foo",则传递替换字符串 "$2bar" 将导致 "foobar" 被添加到字符串缓冲区。可能将美元符号 ($) 作为替换字符串中的字面值(通过前面使用一个反斜线 (\$))包括进来。注意,在替换字符串中使用反斜线 (\) 和美元符号 ($) 可能导致与作为字面值替换字符串时所产生的结果不同。美元符号可视为到如上所述已捕获子序列的引用,反斜线可用于转义替换字符串中的字面值字符。
此方法设计用于循环以及
appendTail
和find
方法中。例如,以下代码将 one dog two dogs in the yard 写入标准输出流中:Pattern p = Pattern.compile("cat"); Matcher m = p.matcher("one cat two cats in the yard"); StringBuffer sb = new StringBuffer(); while (m.find()) { m.appendReplacement(sb, "dog"); } m.appendTail(sb); System.out.println(sb.toString());
-
-
参数:
-
sb
- 目标字符串缓冲区。 -
replacement
- 替换字符串。
返回:
- 匹配器。 抛出:
-
IllegalStateException
- 如果没有尝试任何匹配,或者以前的匹配操作失败。 -
IndexOutOfBoundsException
- 如果替换字符串引用模式中不存在的捕获组。
-
appendTail
public StringBuffer appendTail(StringBuffer sb)
-
实现终端添加和替换步骤。
此方法从添加位置开始从输入序列读取字符,并将其添加到给定字符串缓冲区。可以在一次或多次调用
appendReplacement
方法后调用它来复制剩余的输入序列。 -
-
参数:
-
sb
- 目标字符串缓冲区。
返回:
- 目标字符串缓冲区。
-
replaceAll
public String replaceAll(String replacement)
-
替换模式与给定替换字符串相匹配的输入序列的每个子序列。
此方法首先重置匹配器。然后,它将扫描输入序列以查找该模式的匹配项。不属于任何匹配的字符被直接添加到结果字符串;在结果中每个匹配都将被替换字符串所替换。替换字符串可能包含到已捕获子序列的引用,如在
appendReplacement
方法中一样。注意,在替换字符串中使用反斜线 (\) 和美元符号 ($) 可能导致与作为字面值替换字符串时所产生的结果不同。美元符号可视为到如上所述已捕获子序列的引用,反斜线可用于转义替换字符串中的字面值字符。
在给定正则表达式 a*b、输入 "aabfooaabfooabfoob" 和替换字符串 "-" 的情况下,为该表达式针对匹配器调用此方法将产生字符串 "-foo-foo-foo-"。
调用此方法将更改此匹配器的状态。如果在将来的匹配操作中使用该匹配器,则应该首先重置它。
-
-
参数:
-
replacement
- 替换字符串。
返回:
- 通过使用替换字符串替换每个匹配子序列,并在需要时取代已捕获子序列所构造的字符串。
-
replaceFirst
public String replaceFirst(String replacement)
-
替换模式与给定替换字符串匹配的输入序列的第一个子序列。
此方法首先重置匹配器。然后,它将扫描输入序列以查找该模式的匹配项。不是匹配一部分的字符被直接添加到结果字符串;在结果中匹配内容将被替换字符串替换。替换字符串可能包含到已捕获子序列的引用,如在
appendReplacement
方法中一样。注意,在替换字符串中使用反斜线 (\) 和美元符号 ($) 可能导致与作为字面值替换字符串时所产生的结果不同。美元符号可视为到如上所述已捕获子序列的引用,反斜线可用于转义替换字符串中的字面值字符。
在给定正则表达式 dog、输入 "zzzdogzzzdogzzz" 和替换字符串 "cat" 的情况下,为该表达式针对匹配器调用此方法将产生字符串 "zzzcatzzzdogzzz"。
调用此方法将更改此匹配器的状态。如果在将来的匹配操作中使用该匹配器,则应该首先重置它。
-
-
参数:
-
replacement
- 替换字符串。
返回:
- 通过使用替换字符串替换第一个匹配子序列,并在需要时取代已捕获子序列所构造的字符串。
-
region
public Matcher region(int start, int end)
-
设置此匹配器的区域限制。区域是输入序列的一部分,搜索它可以查找匹配。调用此方法会重置匹配器,然后设置区域,使其从
start
参数指定的索引开始,到end
参数指定的索引结束。某些构造(如定位点)可能因所用的透明度和定位不同(参见
useTransparentBounds
和useAnchoringBounds
),从而在区域的边界上或边界四周的行为也有所不同。 -
-
参数:
-
start
- 索引,从此索引(包括在内)开始搜索。 -
end
- 到此(包括在内)结束搜索的索引。
返回:
- 匹配器。 抛出:
-
IndexOutOfBoundsException
- 如果开始点或结束点小于零,并且开始点的长度大于输入序列的长度,结束点的长度大于输入序列的长度,或者开始点大于结束点。
从以下版本开始:
- 1.5
-
regionStart
public int regionStart()
-
报告此匹配器区域的开始索引。此匹配器所进行的搜索被限制在
regionStart
(包括)和regionEnd
(不包括)中查找匹配。 -
-
返回:
- 匹配器区域的开始点。 从以下版本开始:
- 1.5
regionEnd
public int regionEnd()
-
报告此匹配器区域的结束索引(不包括)。此匹配器所进行的搜索被限制在
regionStart
(包括)和regionEnd
(不包括)中查找匹配。 -
-
返回:
- 匹配器区域的结束点。 从以下版本开始:
- 1.5
hasTransparentBounds
public boolean hasTransparentBounds()
-
查询此匹配器区域边界的透明度。
如果此匹配器使用透明 边界,则此方法返回 true;如果使用不透明 边界,则返回 false。
有关透明和不透明边界的描述,请参阅
useTransparentBounds
。默认情况下,匹配器使用不透明区域边界。
-
-
返回:
- 当且仅当此匹配器使用透明边界时才返回 true;否则返回 false。 从以下版本开始:
- 1.5 另请参见:
-
useTransparentBounds(boolean)
useTransparentBounds
public Matcher useTransparentBounds(boolean b)
-
设置此匹配器区域边界的透明度。
利用参数 true 调用此方法将设置此匹配器使用透明 边界。如果布尔参数为 false,则使用不透明 边界。
使用透明边界,此匹配器区域的边界对 lookahead、lookbehind 和边界匹配构造都是透明的。可以使用这些构造查看区域边界的外部,以了解匹配是否正确。
使用不透明边界,此匹配器区域的边界对 lookahead、lookbehind 和试图查看其外部的边界匹配构造都是不透明的。这些构造无法穿过边界查看,因此不能使用它们匹配区域之外的任何内容。
默认情况下,匹配器使用不透明边界。
-
-
参数:
-
b
- 指示使用不透明还是透明区域的布尔值。
返回:
- 匹配器。 从以下版本开始:
- 1.5 另请参见:
-
hasTransparentBounds()
-
hasAnchoringBounds
public boolean hasAnchoringBounds()
-
查询此匹配器区域界限的定位。
如果此匹配器使用定位 界限,则此方法返回 true;否则返回 false。
有关获取定位界限的描述,请参阅
useAnchoringBounds
。默认情况下,匹配器使用定位区域边界。
-
-
返回:
- 当且仅当此匹配器使用定位界限时才返回 true;否则返回 false。 从以下版本开始:
- 1.5 另请参见:
-
useAnchoringBounds(boolean)
useAnchoringBounds
public Matcher useAnchoringBounds(boolean b)
-
设置匹配器区域界限的定位。
利用参数 true 调用此方法将设置此匹配器使用定位 界限。如果布尔参数为 false,则使用非定位 界限。
使用定位界限,此匹配器区域的边界与定位点(如 ^ 和 $)匹配。
不使用定位界限,此匹配器区域的边界将与定位点(如 ^ 和 $)不匹配。
默认情况下,匹配器使用定位区域边界。
-
-
参数:
-
b
- 指示是否使用定位界限的布尔值。
返回:
- 匹配器。 从以下版本开始:
- 1.5 另请参见:
-
hasAnchoringBounds()
-
toString
public String toString()
-
返回匹配器的字符串表示形式。包含可用于调试的信息的
Matcher
字符串表示形式。未指定确切格式。 -
-
返回:
- 匹配器的字符串表示形式。 从以下版本开始:
- 1.5
hitEnd
public boolean hitEnd()
-
如果匹配器执行的最后匹配操作中搜索引擎遇到输入结尾,则返回 true。
此方法返回 true 时,很多输入都可能更改最后搜索的结果。
-
-
返回:
- 当且仅当在最后匹配中遇到输入结尾时才返回 true;否则返回 false。 从以下版本开始:
- 1.5
requireEnd
public boolean requireEnd()
-
如果很多输入都可以将正匹配更改为负匹配,则返回 true。
如果此方法返回 true,并且找到了匹配,则很多输入可能导致匹配丢失。如果此方法返回 false,并且找到了匹配,则很多输入可能更改匹配,但是匹配不会丢失。如果未找到匹配,则 requireEnd 没有意义。
-
-
返回:
- 当且仅当很多输入都可以将正匹配更改为负匹配时才返回 true。 从以下版本开始:
- 1.5
| JavaTM Platform Standard Ed. 6 | |||||||||
上一个类 下一个类 | 框架 无框架 | |||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
java.util.regex
类 Pattern
java.lang.Object java.util.regex.Pattern
-
所有已实现的接口:
- Serializable
public final class Patternextends Object implements Serializable
正则表达式的编译表示形式。
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher
对象,依照正则表达式,该对象可以与任意字符序列
匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
因此,典型的调用顺序是
Pattern p = Pattern.compile
("a*b"); Matcher m = p.matcher
("aaaaab"); boolean b = m.matches
();
在仅使用一次正则表达式时,可以方便地通过此类定义 matches
方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句
等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。boolean b = Pattern.matches("a*b", "aaaaab");
此类的实例是不可变的,可供多个并发线程安全使用。Matcher
类的实例用于此目的则不安全。
正则表达式的构造摘要
的 非捕获组构造 | 匹配 |
---|---|
字符 | |
x | 字符 x |
\\ | 反斜线字符 |
\0n | 带有八进制值 0 的字符 n (0 <= n <= 7) |
\0nn | 带有八进制值 0 的字符 nn (0 <= n <= 7) |
\0mnn | 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7) |
\xhh | 带有十六进制值 0x 的字符 hh |
\uhhhh | 带有十六进制值 0x 的字符 hhhh |
\t | 制表符 ('\u0009') |
\n | 新行(换行)符 ('\u000A') |
\r | 回车符 ('\u000D') |
\f | 换页符 ('\u000C') |
\a | 报警 (bell) 符 ('\u0007') |
\e | 转义符 ('\u001B') |
\cx | 对应于 x 的控制符 |
字符类 | |
[abc] | a、b 或 c(简单类) |
[^abc] | 任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] | a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
[a-d[m-p]] | a 到 d 或 m 到 p:[a-dm-p](并集) |
[a-z&&[def]] | d、e 或 f(交集) |
[a-z&&[^bc]] | a 到 z,除了 b 和 c:[ad-z](减去) |
[a-z&&[^m-p]] | a 到 z,而非 m 到 p:[a-lq-z](减去) |
预定义字符类 | |
. | 任何字符(与行结束符可能匹配也可能不匹配) |
\d | 数字:[0-9] |
\D | 非数字: [^0-9] |
\s | 空白字符:[ \t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | 单词字符:[a-zA-Z_0-9] |
\W | 非单词字符:[^\w] |
POSIX 字符类(仅 US-ASCII) | |
\p{Lower} | 小写字母字符:[a-z] |
\p{Upper} | 大写字母字符:[A-Z] |
\p{ASCII} | 所有 ASCII:[\x00-\x7F] |
\p{Alpha} | 字母字符:[\p{Lower}\p{Upper}] |
\p{Digit} | 十进制数字:[0-9] |
\p{Alnum} | 字母数字字符:[\p{Alpha}\p{Digit}] |
\p{Punct} | 标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ |
\p{Graph} | 可见字符:[\p{Alnum}\p{Punct}] |
\p{Print} | 可打印字符:[\p{Graph}\x20] |
\p{Blank} | 空格或制表符:[ \t] |
\p{Cntrl} | 控制字符:[\x00-\x1F\x7F] |
\p{XDigit} | 十六进制数字:[0-9a-fA-F] |
\p{Space} | 空白字符:[ \t\n\x0B\f\r] |
java.lang.Character 类(简单的 java 字符类型) | |
\p{javaLowerCase} | 等效于 java.lang.Character.isLowerCase() |
\p{javaUpperCase} | 等效于 java.lang.Character.isUpperCase() |
\p{javaWhitespace} | 等效于 java.lang.Character.isWhitespace() |
\p{javaMirrored} | 等效于 java.lang.Character.isMirrored() |
Unicode 块和类别的类 | |
\p{InGreek} | Greek 块(简单块)中的字符 |
\p{Lu} | 大写字母(简单类别) |
\p{Sc} | 货币符号 |
\P{InGreek} | 所有字符,Greek 块中的除外(否定) |
[\p{L}&&[^\p{Lu}]] | 所有字母,大写字母除外(减去) |
边界匹配器 | |
^ | 行的开头 |
$ | 行的结尾 |
\b | 单词边界 |
\B | 非单词边界 |
\A | 输入的开头 |
\G | 上一个匹配的结尾 |
\Z | 输入的结尾,仅用于最后的结束符(如果有的话) |
\z | 输入的结尾 |
Greedy 数量词 | |
X? | X,一次或一次也没有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{n} | X,恰好 n 次 |
X{n,} | X,至少 n 次 |
X{n,m} | X,至少 n 次,但是不超过 m 次 |
Reluctant 数量词 | |
X?? | X,一次或一次也没有 |
X*? | X,零次或多次 |
X+? | X,一次或多次 |
X{n}? | X,恰好 n 次 |
X{n,}? | X,至少 n 次 |
X{n,m}? | X,至少 n 次,但是不超过 m 次 |
Possessive 数量词 | |
X?+ | X,一次或一次也没有 |
X*+ | X,零次或多次 |
X++ | X,一次或多次 |
X{n}+ | X,恰好 n 次 |
X{n,}+ | X,至少 n 次 |
X{n,m}+ | X,至少 n 次,但是不超过 m 次 |
Logical 运算符 | |
XY | X 后跟 Y |
X|Y | X 或 Y |
(X) | X,作为捕获组 |
Back 引用 | |
\n | 任何匹配的 nth 捕获组 |
引用 | |
\ | Nothing,但是引用以下字符 |
\Q | Nothing,但是引用所有字符,直到 \E |
\E | Nothing,但是结束从 \Q 开始的引用 |
特殊构造(非捕获) | |
(?:X) | X,作为非捕获组 |
(?idmsux-idmsux) | Nothing,但是将匹配标志i d m s u x on - off |
(?idmsux-idmsux:X) | X,作为带有给定标志 i d m s u x on - off |
(?=X) | X,通过零宽度的正 lookahead |
(?!X) | X,通过零宽度的负 lookahead |
(?<=X) | X,通过零宽度的正 lookbehind |
(?<!X) | X,通过零宽度的负 lookbehind |
(?>X) | X,作为独立的非捕获组 |
反斜线、转义和引用
反斜线字符 ('\') 用于引用转义构造,如上表所定义的,同时还用于引用其他将被解释为非转义构造的字符。因此,表达式 \\ 与单个反斜线匹配,而 \{ 与左括号匹配。
在不表示转义构造的任何字母字符前使用反斜线都是错误的;它们是为将来扩展正则表达式语言保留的。可以在非字母字符前使用反斜线,不管该字符是否非转义构造的一部分。
根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 "\b" 与单个退格字符匹配,而 "\\b" 与单词边界匹配。字符串字面值 "\(hello\)" 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 "\\(hello\\)"。
字符类
字符类可以出现在其他字符类中,并且可以包含并集运算符(隐式)和交集运算符 (&&)。并集运算符表示至少包含其某个操作数类中所有字符的类。交集运算符表示包含同时位于其两个操作数类中所有字符的类。
字符类运算符的优先级如下所示,按从最高到最低的顺序排列:
1 字面值转义 \x 2 分组 [...] 3 范围 a-z 4 并集 [a-e][i-u] 5 交集 [a-z&&[aeiou]]
注意,元字符的不同集合实际上位于字符类的内部,而非字符类的外部。例如,正则表达式 . 在字符类内部就失去了其特殊意义,而表达式 - 变成了形成元字符的范围。
行结束符
行结束符 是一个或两个字符的序列,标记输入字符序列的行结尾。以下代码被识别为行结束符:
- 新行(换行)符 ('\n')、
- 后面紧跟新行符的回车符 ("\r\n")、
- 单独的回车符 ('\r')、
- 下一行字符 ('\u0085')、
- 行分隔符 ('\u2028') 或
- 段落分隔符 ('\u2029)。
如果激活 UNIX_LINES
模式,则新行符是唯一识别的行结束符。
如果未指定 DOTALL
标志,则正则表达式 . 可以与任何字符(行结束符除外)匹配。
默认情况下,正则表达式 ^ 和 $ 忽略行结束符,仅分别与整个输入序列的开头和结尾匹配。如果激活 MULTILINE
模式,则 ^ 在输入的开头和行结束符之后(输入的结尾)才发生匹配。处于 MULTILINE
模式中时,$ 仅在行结束符之前或输入序列的结尾处匹配。
组和捕获
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C))) 2 \A 3 (B(C)) 4 (C)
组零始终代表整个表达式。
之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过 Back 引用在表达式中使用,也可以在匹配操作完成后从匹配器获取。
与组关联的捕获输入始终是与组最近匹配的子序列。如果由于量化的缘故再次计算了组,则在第二次计算失败时将保留其以前捕获的值(如果有的话)例如,将字符串 "aba" 与表达式 (a(b)?)+ 相匹配,会将第二组设置为 "b"。在每个匹配的开头,所有捕获的输入都会被丢弃。
以 (?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。
Unicode 支持
此类符合 Unicode Technical Standard #18:Unicode Regular Expression Guidelines 第 1 级和 RL2.1 Canonical Equivalents。
Java 源代码中的 Unicode 转义序列(如 \u2014)是按照 Java Language Specification 的 第 3.3 节中的描述处理的。这样的转义序列还可以由正则表达式解析器直接实现,以便在从文件或键盘击键读取的表达式中使用 Unicode 转义。因此,可以将不相等的字符串 "\u2014"和 "\\u2014" 编译为相同的模式,从而与带有十六进制值 0x2014 的字符匹配。
与 Perl 中一样,Unicode 块和类别是使用 \p 和 \P 构造编写的。如果输入具有属性 prop,则与 \p{prop} 匹配,而输入具有该属性时与 \P{prop} 不匹配。块使用前缀 In 指定,与在 InMongolian 中一样。可以使用可选前缀 Is 指定类别:\p{L} 和 \p{IsL} 都表示 Unicode 字母的类别。块和类别在字符类的内部和外部都可以使用。
受支持的类别是由 Character
类指定版本中的 The Unicode Standard 的类别。类别名称是在 Standard 中定义的,即标准又丰富。Pattern
所支持的块名称是 UnicodeBlock.forName
所接受和定义的有效块名称。
行为类似 java.lang.Character boolean 是 methodname 方法(废弃的类别除外)的类别,可以通过相同的 \p{prop} 语法来提供,其中指定的属性具有名称 javamethodname。
与 Perl 5 相比较
Pattern
引擎用有序替换项执行传统上基于 NFA 的匹配,与 Perl 5 中进行的相同。
此类不支持 Perl 构造:
条件构造 (?{X}) 和 (?(condition)X|Y)、
嵌入式代码构造 (?{code}) 和 (??{code})、
嵌入式注释语法 (?#comment) 和
预处理操作 \l \u、\L 和 \U。
此类支持但 Perl 不支持的构造:
Possessive 数量词,它可以尽可能多地进行匹配,即使这样做导致所有匹配都成功时也如此。
字符类并集和交集,如上文所述。
与 Perl 的显著不同点是:
在 Perl 中,\1 到 \9 始终被解释为 Back 引用;如果至少存在多个子表达式,则大于 9 的反斜线转义数按 Back 引用对待,否则在可能的情况下,它将被解释为八进制转义。在此类中,八进制转义必须始终以零开头。在此类中,\1 到 \9 始终被解释为 Back 引用,较大的数被接受为 Back 引用,如果在正则表达式中至少存在多个子表达式的话;否则,解析器将删除数字,直到该数小于等于组的现有数或者其为一个数字。
Perl 使用 g 标志请求恢复最后匹配丢失的匹配。此功能是由
Matcher
类显式提供的:重复执行find
方法调用可以恢复丢失的最后匹配,除非匹配器被重置。在 Perl 中,位于表达式顶级的嵌入式标记对整个表达式都有影响。在此类中,嵌入式标志始终在它们出现的时候才起作用,不管它们位于顶级还是组中;在后一种情况下,与在 Perl 中类似,标志在组的结尾处还原。
Perl 允许错误匹配构造,如在表达式 *a 中,以及不匹配的括号,如在在表达式 abc] 中,并将其作为字面值对待。此类还接受不匹配的括号,但对 +、? 和 * 不匹配元字符有严格限制;如果遇到它们,则抛出
PatternSyntaxException
。
有关正则表达式构造行为更准确的描述,请参见 Mastering Regular Expressions, 2nd Edition,该书由 Jeffrey E. F. Friedl、O'Reilly 和 Associates 合著,于 2002 年出版。
-
从以下版本开始:
- 1.4 另请参见:
-
String.split(String, int)
,String.split(String)
, 序列化表格
字段摘要 | |
---|---|
static int | CANON_EQ 启用规范等价。 |
static int | CASE_INSENSITIVE 启用不区分大小写的匹配。 |
static int | COMMENTS 模式中允许空白和注释。 |
static int | DOTALL 启用 dotall 模式。 |
static int | LITERAL 启用模式的字面值解析。 |
static int | MULTILINE 启用多行模式。 |
static int | UNICODE_CASE 启用 Unicode 感知的大小写折叠。 |
static int | UNIX_LINES 启用 Unix 行模式。 |
方法摘要 | |
---|---|
static Pattern | compile(String regex) 将给定的正则表达式编译到模式中。 |
static Pattern | compile(String regex, int flags) 将给定的正则表达式编译到具有给定标志的模式中。 |
int | flags() 返回此模式的匹配标志。 |
Matcher | matcher(CharSequence input) 创建匹配给定输入与此模式的匹配器。 |
static boolean | matches(String regex, CharSequence input) 编译给定正则表达式并尝试将给定输入与其匹配。 |
String | pattern() 返回在其中编译过此模式的正则表达式。 |
static String | quote(String s) 返回指定 String 的字面值模式 String 。 |
String[] | split(CharSequence input) 围绕此模式的匹配拆分给定输入序列。 |
String[] | split(CharSequence input, int limit) 围绕此模式的匹配拆分给定输入序列。 |
String | toString() 返回此模式的字符串表示形式。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
字段详细信息 |
---|
UNIX_LINES
public static final int UNIX_LINES
-
启用 Unix 行模式。
在此模式中,.、^ 和 $ 的行为中仅识别 '\n' 行结束符。
通过嵌入式标志表达式 (?d) 也可以启用 Unix 行模式。
-
另请参见:
- 常量字段值
CASE_INSENSITIVE
public static final int CASE_INSENSITIVE
-
启用不区分大小写的匹配。
默认情况下,不区分大小写的匹配假定仅匹配 US-ASCII 字符集中的字符。可以通过指定
UNICODE_CASE
标志连同此标志来启用 Unicode 感知的、不区分大小写的匹配。通过嵌入式标志表达式 (?i) 也可以启用不区分大小写的匹配。
指定此标志可能对性能产生一些影响。
-
另请参见:
- 常量字段值
COMMENTS
public static final int COMMENTS
-
模式中允许空白和注释。
此模式将忽略空白和在结束行之前以 # 开头的嵌入式注释。
通过嵌入式标志表达式 (?x) 也可以启用注释模式。
-
另请参见:
- 常量字段值
MULTILINE
public static final int MULTILINE
-
启用多行模式。
在多行模式中,表达式 ^ 和 $ 仅分别在行结束符前后匹配,或者在输入序列的结尾处匹配。默认情况下,这些表达式仅在整个输入序列的开头和结尾处匹配。
通过嵌入式标志表达式 (?m) 也可以启用多行模式。
-
另请参见:
- 常量字段值
LITERAL
public static final int LITERAL
-
启用模式的字面值解析。
指定此标志后,指定模式的输入字符串就会作为字面值字符序列来对待。输入序列中的元字符或转义序列不具有任何特殊意义。
标志 CASE_INSENSITIVE 和 UNICODE_CASE 在与此标志一起使用时将对匹配产生影响。其他标志都变得多余了。
不存在可以启用字面值解析的嵌入式标志字符。
-
从以下版本开始:
- 1.5 另请参见:
- 常量字段值
DOTALL
public static final int DOTALL
-
启用 dotall 模式。
在 dotall 模式中,表达式 . 可以匹配任何字符,包括行结束符。默认情况下,此表达式不匹配行结束符。
通过嵌入式标志表达式 (?s) 也可以启用 dotall 模式(s 是 "single-line" 模式的助记符,在 Perl 中也使用它)。
-
另请参见:
- 常量字段值
UNICODE_CASE
public static final int UNICODE_CASE
-
启用 Unicode 感知的大小写折叠。
指定此标志后,由
CASE_INSENSITIVE
标志启用时,不区分大小写的匹配将以符合 Unicode Standard 的方式完成。默认情况下,不区分大小写的匹配假定仅匹配 US-ASCII 字符集中的字符。通过嵌入式标志表达式 (?u) 也可以启用 Unicode 感知的大小写折叠。
指定此标志可能对性能产生影响。
-
另请参见:
- 常量字段值
CANON_EQ
public static final int CANON_EQ
-
启用规范等价。
指定此标志后,当且仅当其完整规范分解匹配时,两个字符才可视为匹配。例如,当指定此标志时,表达式 "a\u030A" 将与字符串 "\u00E5" 匹配。默认情况下,匹配不考虑采用规范等价。
不存在可以启用规范等价的嵌入式标志字符。
指定此标志可能对性能产生影响。
-
另请参见:
- 常量字段值
方法详细信息 |
---|
compile
public static Pattern compile(String regex)
- 将给定的正则表达式编译到模式中。
-
-
参数:
-
regex
- 要编译的表达式
抛出:
-
PatternSyntaxException
- 如果表达式的语法无效
-
compile
public static Pattern compile(String regex, int flags)
- 将给定的正则表达式编译到具有给定标志的模式中。
-
-
参数:
-
regex
- 要编译的表达式 -
flags
- 匹配标志,可能包括CASE_INSENSITIVE
、MULTILINE
、DOTALL
、UNICODE_CASE
、CANON_EQ
、UNIX_LINES
、LITERAL
和COMMENTS
的位掩码
抛出:
-
IllegalArgumentException
- 如果在 flags 中设置与定义的匹配标志不对应的位值 -
PatternSyntaxException
- 如果表达式的语法无效
-
pattern
public String pattern()
- 返回在其中编译过此模式的正则表达式。
-
-
返回:
- 模式的源代码
toString
public String toString()
matcher
public Matcher matcher(CharSequence input)
- 创建匹配给定输入与此模式的匹配器。
-
-
参数:
-
input
- 要匹配的字符序列
返回:
- 此模式的新匹配器
-
flags
public int flags()
- 返回此模式的匹配标志。
-
-
返回:
- 编译此模式时指定的匹配标志
matches
public static boolean matches(String regex, CharSequence input)
-
编译给定正则表达式并尝试将给定输入与其匹配。
调用此便捷方法的形式
Pattern.matches(regex, input);
Pattern.compile(regex).matcher(input).matches()
如果要多次使用一种模式,编译一次后重用此模式比每次都调用此方法效率更高。
-
-
参数:
-
regex
- 要编译的表达式 -
input
- 要匹配的字符序列
抛出:
-
PatternSyntaxException
- 如果表达式的语法无效
-
split
public String[] split(CharSequence input, int limit)
-
围绕此模式的匹配拆分给定输入序列。
此方法返回的数组包含输入序列的子字符串,由匹配此模式的另一子序列或输入序列的结尾终止。数组中子字符串的顺序与其在输入中出现的顺序相同。如果此模式与输入的任何子序列都不匹配,那么得到的数组仅包含一个元素,即字符串形式的输入序列。
limit 参数控制应用模式的次数,从而影响结果数组的长度。如果限制 n 大于零,那么模式至多应用 n> - 1 次,数组的长度不大于 n,并且数组的最后条目将包含除最后的匹配定界符之外的所有输入。如果 n 非正,那么将应用模式的次数不受限制,并且数组可以为任意长度。如果 n 为零,那么应用模式的次数不受限制,数组可以为任意长度,并且将丢弃尾部空字符串。
例如,输入 "boo:and:foo" 将产生以下结果及参数:
Regex
Limit
Result
: 2 { "boo", "and:foo" } : 5 { "boo", "and", "foo" } : -2 { "boo", "and", "foo" } o 5 { "b", "", ":and:f", "", "" } o -2 { "b", "", ":and:f", "", "" } o 0 { "b", "", ":and:f" } -
-
参数:
-
input
- 要拆分的字符序列 -
limit
- 结果阈值,如上文中所述
返回:
- 根据围绕此模式的匹配来拆分输入后所计算的字符串数组
-
split
public String[] split(CharSequence input)
-
围绕此模式的匹配拆分给定输入序列。
此方法的工作方式类似于使用给定的输入序列和限制参数零调用两参数 (java.lang.CharSequence, int) split} 方法。因此,得到的数组中不包括尾部空字符串。
例如,输入 "boo:and:foo" 将产生以下结果及表达式:
Regex
Result
: { "boo", "and", "foo" } o { "b", "", ":and:f" } -
-
参数:
-
input
- 要拆分的字符序列
返回:
- 根据围绕此模式的匹配来拆分输入后所计算的字符串数组
-
quote
public static String quote(String s)
-
返回指定
String
的字面值模式String
。此方法产生一个
输入序列中的元字符和转义序列不具有任何特殊意义。String
,可以将其用于创建与字符串s
匹配的Pattern
,就好像它是字面值模式一样。 -
-
参数:
-
s
- 要字面值化的字符串
返回:
- 字面值字符串替换 从以下版本开始:
- 1.5
-