快速上手-正则表达式regex

正则表达式,Regular Expression,简写为regex,regex就是用来处理字符串的,被称作字符串的处理利器;

regex是在Unix上流行起来,真正学习起来,内容上相当于一套小小的语言;

>正则表达式用途

  • 字符串匹配(字符匹配:实际就是一个字符一个字符的匹配)
  • 字符串查找
  • 字符串替换

例如:

  • IP地址是否正确;
  • 从网页中将Email地址揪出来;
  • 从网页中揪出链接等;

涉及到的类:

java.lang.String

java.util.regex.Pattern

java.util.regex.Matcher

简单来说,Pattern就是字符串所要匹配的那种模式,而Matcher就是字符串匹配模式后产生的结果;

>String类的matches方法

由此可见,regex本身也是一个特殊字符串;

>典型的调用顺序是

 Pattern p = Pattern.compile("a*b");//这里先将正则表达式编译一下,这样再匹配时速度会快;
 Matcher m = p.matcher("aaaaab");
 boolean b = m.matches();

>regex中也有正常的字符,比如单独写字符abc,就是匹配abc

 > .  *  +  ?

匹配任意

* 代表零个或多个;

+代表一个或多个;

?代表一个或零个;

{ 数字 } 指定个数;

>范围

中括号[ ]代表取范围,^代表除去之外的范围,不写并列或者用|连接表示或,&&交集;

>关于反斜杠\

regex里,匹配一个反斜杠\,写4个\\\\

预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w

>POSIX (原来是Unix里一套标准)形式/风格

见API

>边界

^位于[^ ]内部时,表示的是取反;

位于[ ]外面时,代表的是输入的开头;

\b 单词边界

      aaaa  bbbb       ....\\b.... 

边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾

>匹配Email

>Matcher 的方法

 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)
          设置此匹配器区域边界的透明度。

>补充API文档,详细见下方

构造 匹配
 
字符
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 XY
(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,作为独立的非捕获组

猜你喜欢

转载自blog.csdn.net/AhaQianxun/article/details/87823931