正则表达式

来源:互联网 发布:淘宝怎么设置关联店铺 编辑:程序博客网 时间:2024/05/03 01:14

在表达式中有特殊意义,需要添加 "\" 才能匹配该字符本身的字符汇总

 

字符说明^匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 "\^"$匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 "\$"( )标记一个子表达式的开始和结束位置。要匹配小括号,请使用 "\(" 和 "\)"[ ]用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号,请使用 "\[" 和 "\]"{ }修饰匹配次数的符号。要匹配大括号,请使用 "\{" 和 "\}".匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用 "\."?修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身,请使用 "\?"+修饰匹配次数为至少 1 次。要匹配 "+" 字符本身,请使用 "\+"*修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 "\*"|左右两边表达式之间 "或" 关系。匹配 "|" 本身,请使用 "\|"字符描述\将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。^匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。$匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。*匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。+匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。?匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。{n}n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。{n,}n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。{n,m}mn均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。?当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。.匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“[.\n]”的模式。(pattern)匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括號字符,请使用“\(”或“\)”。(?:pattern)匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用“或”字符(|)来组合一个模式的各个部分是很有用。例如,“industr(?:y|ies)就是一个比”industry|industries'更简略的表达式。(?=pattern)正向预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。(?!pattern)负向预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始x|y匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。[xyz]字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。[^xyz]负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“p”。[a-z]字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。[^a-z]负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。\b匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。\B匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。\cx匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。\d匹配一个数字字符。等价于[0-9]。\D匹配一个非数字字符。等价于[^0-9]。\f匹配一个换页符。等价于\x0c和\cL。\n匹配一个换行符。等价于\x0a和\cJ。\r匹配一个回车符。等价于\x0d和\cM。\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]。\S匹配任何非空白字符。等价于[^\f\n\r\t\v]。\t匹配一个制表符。等价于\x09和\cI。\v匹配一个垂直制表符。等价于\x0b和\cK。\w匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。\W匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。\xn匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41”匹配“A”。“\x041”则等价于“\x04”&“1”。正則表达式中可以使用ASCII编码。.\num匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。\n标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。\nm标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若nm均为八进制数字(0-7),则\nm将匹配八进制转义值nm。\nml如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。\un

匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(©)。

 

 

1.1.字符

   字符x。例如a表示字符a

\\   反斜线字符。在书写时要写为\\\\。(注意:因为java在第一次解析时把\\\\解析成正则表达式\\,在第二次解析时再解析为\,所以凡是不是1.1列举到的转义字符,包括1.1的\\,而又带有\的都要写两次)

\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的控制符

1.2.字符类

[abc]    a、b或c(简单类)。例如[egd]表示包含有字符e、g或d。

[^abc]   任何字符,除了 a、b或 c(否定)。例如[^egd]表示不包含字符e、g或d。

[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](减去)

1.3.预定义字符类(注意反斜杠要写两次,例如\d写为\\d)

  任何字符(与行结束符可能匹配也可能不匹配)

\d   数字:[0-9]

\D    非数字:[^0-9]

\s    空白字符:[\t\n\x0B\f\r]

\S   非空白字符:[^\s]

\w   单词字符:[a-zA-Z_0-9]

\W   非单词字符:[^\w]

1.4.POSIX 字符类(仅US-ASCII)(注意反斜杠要写两次,例如\p{Lower}写为\\p{Lower})

\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]

1.5.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()

1.6.Unicode 块和类别的类

\p{InGreek}   Greek 块(简单块)中的字符

\p{Lu}   大写字母(简单类别)

\p{Sc}   货币符号

\P{InGreek}   所有字符,Greek 块中的除外(否定)

[\p{L}&&[^\p{Lu}]]    所有字母,大写字母除外(减去)

1.7.边界匹配器

  行的开头,请在正则表达式的开始处使用^。例如:^(abc)表示以abc开头的字符串。注意编译的时候要设置参数MULTILINE,如Pattern p = Pattern.compile(regex,Pattern.MULTILINE);

  行的结尾,请在正则表达式的结束处使用。例如:(^bca).*(abc$)表示以bca开头以abc结尾的行。

\b   单词边界。例如\b(abc)表示单词的开始或结束包含有abc,(abcjj、jjabc 都可以匹配)

\B   非单词边界。例如\B(abc)表示单词的中间包含有abc,(jjabcjj匹配而jjabc、abcjj不匹配)

\A   输入的开头

\G   上一个匹配的结尾(个人感觉这个参数没什么用)。例如\\Gdog表示在上一个匹配结尾处查找dog如果没有的话则从开头查找,注意如果开头不是dog则不能匹配。

\Z   输入的结尾,仅用于最后的结束符(如果有的话)

行结束符 是一个或两个字符的序列,标记输入字符序列的行结尾。

以下代码被识别为行结束符:

‐新行(换行)符 ('\n')、

‐后面紧跟新行符的回车符 ("\r\n")、

‐单独的回车符 ('\r')、

‐下一行字符 ('\u0085')、

‐行分隔符 ('\u2028') 或

‐段落分隔符 ('\u2029)。

\z   输入的结尾

当编译模式时,可以设置一个或多个标志,例如

Pattern pattern =Pattern.compile(patternString,Pattern.CASE_INSENSITIVE +Pattern.UNICODE_CASE);

下面六个标志都是支持的:

‐CASE_INSENSITIVE:匹配字符时与大小写无关,该标志默认只考虑US ASCII字符。

‐UNICODE_CASE:当与CASE_INSENSITIVE结合时,使用Unicode字母匹配

‐MULTILINE:^和$匹配一行的开始和结尾,而不是整个输入

‐UNIX_LINES: 当在多行模式下匹配^和$时,只将'\n'看作行终止符

‐DOTALL: 当使用此标志时,.符号匹配包括行终止符在内的所有字符

‐CANON_EQ: 考虑Unicode字符的规范等价

1.8.Greedy 数量词

X?   X,一次或一次也没有

X*   X,零次或多次

X+   X,一次或多次

X{n}    X,恰好n 次

X{n,}    X,至少n 次

X{n,m}   X,至少 n 次,但是不超过 m 次

1.9.Reluctant 数量词

X??   X,一次或一次也没有

X*?   X,零次或多次

X+?   X,一次或多次

X{n}?    X,恰好n 次

X{n,}?   X,至少 n 次

X{n,m}?   X,至少 n 次,但是不超过 m 次

1.10.Possessive 数量词

X?+   X,一次或一次也没有

X*+   X,零次或多次

X++   X,一次或多次

X{n}+    X,恰好n 次

X{n,}+   X,至少 n 次

X{n,m}+   X,至少 n 次,但是不超过 m 次

Greedy,Reluctant,Possessive的区别在于:(注意仅限于进行.等模糊处理时)

greedy量词被看作“贪婪的”,因为它第一次就读入整个被模糊匹配的字符串。如果第一个匹配尝试(整个输入字符串)失败,匹配器就会在被匹配字符串中的最后一位后退一个字符并且再次尝试,重复这个过程,直到找到匹配或者没有更多剩下的字符可以后退为止。根据表达式中使用的量词,它最后试图匹配的内容是1个或者0个字符。

但是,reluctant量词采取相反的方式:它们从被匹配字符串的开头开始,然后逐步地一次读取一个字符搜索匹配。它们最后试图匹配的内容是整个输入字符串。

最后,possessive量词总是读完整个输入字符串,尝试一次(而且只有一次)匹配。和greedy量词不同,possessive从不后退。

 

1.11.Logical 运算符

XY    X 后跟Y

X|Y    X 或Y

(X)   X,作为捕获组。例如(abc)表示把abc作为一个整体进行捕获

1.12.Back 引用

\n    任何匹配的nth捕获组

捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C)))中,存在四个这样的组:

      ((A)(B(C)))

      \A

      (B(C))

      (C)

在表达式中可以通过\n来对相应的组进行引用,例如(ab)34\1就表示ab34ab,(ab)34(cd)\1\2就表示ab34cdabcd。

1.13.引用

  Nothing,但是引用以下字符

\Q   Nothing,但是引用所有字符,直到 \E。QE之间的字符串会原封不动的使用(1.1中转义字符的除外)。例如,ab\\Q{|}\\\\E

可以匹配ab{|}\\

\E   Nothing,但是结束从 \Q开始的引用

1.14.特殊构造(非捕获)

(?:X)   X,作为非捕获组

(?idmsux-idmsux)    Nothing,但是将匹配标志由 on 转为 off。比如:表达式 (?i)abc(?-i)def 这时,(?i)打开不区分大小写开关,abc 匹配

idmsux说明如下:

‐i CASE_INSENSITIVE :US-ASCII 字符集不区分大小写。(?i)

‐d UNIX_LINES : 打开UNIX换行符

‐m MULTILINE :多行模式(?m)

UNIX下换行为\n

WINDOWS下换行为\r\n(?s)

‐u UNICODE_CASE : Unicode 不区分大小写。(?u)

‐x COMMENTS:可以在pattern里面使用注解,忽略pattern里面的whitespace,以及"#"一直到结尾(#后面为注解)。(?x)例如(?x)abc#asfsdadsa可以匹配字符串abc

(?idmsux-idmsux:X)    X,作为带有给定标志 on - off 的非捕获组。与上面的类似,上面的表达式,可以改写成为:(?i:abc)def,或者(?i)abc(?-i:def)

(?=X)   X,通过零宽度的正 lookahead。零宽度正先行断言,仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如,\w+(?=\d)表示字母后面跟数字,但不捕获数字(不回溯)

(?!X)   X,通过零宽度的负 lookahead。零宽度负先行断言。仅当子表达式 X 不在此位置的右侧匹配时才继续匹配。例如,\w+(?!\d) 表示字母后面不跟数字,且不捕获数字。

(?<=X)   X,通过零宽度的正 lookbehind。零宽度正后发断言。仅当子表达式 X 在此位置的左侧匹配时才继续匹配。例如,(?<=19)99表示99前面是数字19,但不捕获前面的19。(不回溯)

(?<!X)   X,通过零宽度的负 lookbehind。零宽度负后发断言。仅当子表达式 X不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99表示99前面不能是19,且不捕获前面的东东。

(?>X)   X,作为独立的非捕获组(不回溯)

(?=X)与(?>X)的区别在于(?>X)是不回溯的。例如被匹配的字符串为abcm

当表达式为a(?:b|bc)m是可以匹配的,而当表达式是a(?>b|bc)时是不能匹配的,因为当后者匹配到b时,由于已经匹配,就跳出了非捕获组,而不再次对组内的字符进行匹配。可以加快速度。


转自:http://blog.sina.com.cn/s/blog_4d6503410100m93s.html

0 0
原创粉丝点击