什么是正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

什么是正则表达式

给定一个正则表达式和另一个字符串,我们可以达到如下的目的:

  1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
  2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。


正则表达式的特点

  1. 灵活性、逻辑性和功能性非常的强;
  2. 可以迅速地用极简单的方式达到字符串的复杂控制。
  3. 对于刚接触的人来说,比较晦涩难懂。


由于正则表达式主要应用对象是文本,因此它在各种文本编辑器场合都有应用,小到著名编辑器EditPlus,大到Microsoft Word、Visual Studio等大型编辑器,都可以使用正则表达式来处理文本内容。


正则表达式的标准

大体来讲,正则表达式的文法分为3种标准:

  • BRE
  • ERE
  • ARE

其中 BRE 和 ERE 属于 POSIX 标准,ARE 则是由各家定义的扩展。

POSIX 正则表达式
传统上,POSIX 定义了两种正则表达式语法, 即:基本正则表达式(BRE)和扩展正则表  达式(ERE)。

其中, BRE 定义的语法符号包括:

. - 匹配任意一个字符。 [] - 字符集匹配,匹配方括号中定义的字符集之一。 [^] - 字符集否定匹配,匹配没有在方括号中定义的字符。 ^ - 匹配开始位置。 $ - 匹配结束位置。 () - 定义子表达式。 - 子表达式向前引用,n 为 1-9 之间的数字。 由于此功能已超出正则语义,需 要在字符串中回溯,因此需要使用 NFA 算法进行匹配。

    • 任意次匹配(零次或多次匹配)。{m,n} - 至少 m 次,至多 n 次匹配;{m} 表示 m 次精确匹配;{m,} 表示至少 m次匹配。

    ERE 修改了 BRE 中的部分语法,并增加了以下语法符号:

    ? - 最多一次匹配(零次或一次匹配)。

    • 至少一次匹配(一次或更多次匹配)。| - 或运算,其左右操作数均可以为一个子表达式。

    同时,ERE 取消了子表达式 "()" 和 次数匹配 "{m,n}" 语法符号的转义符引用语法,在使用这两种语法符号时,不在需要添加转义符。 与此同时, ERE 也取消了非正则语义的子表达式向前引用能力。

    BRE 和 ERE 共享同样的 POSIX 字符类定义。同时,它们还支持字符类比较操作 "[. .]"和字符类等效体 "[= =]" 操作,但很少被使用。

    f / fr / wfr / bwfr 等工具默认使用 ERE 模式,同时支持以下 perl 风格的字符类:

    POSIX 类 perl类 描述

    [:alnum:] 字母和数字[:alpha:] a 字母[:lower:] l 小写字母[:upper:] u 大写字母[:blank:] 空白字符(空格和制表符)[:space:] s 所有空格符(比[:blank:]包含的范围广)[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)[:digit:] d 十进制数字[:xdigit:] x 十六进制数字[:graph:] 可打印的非空白字符[:print:] p 可打印字符[:punct:] 标点符号

  • 此外,还有以下特殊字符类:

    perl类 等效POSIX表达式 描述

    o [0-7] 八进制数字O [^0-7] 非八进制数字w [[:alnum:]] 单词构成字符W [^[:alnum:]] 非单词构成字符A [^[:alpha:]] 非字母L [^[:lower:]] 非小写字母U [^[:upper:]] 非大写字母S [^[:space:]] 非空格符D [^[:digit:]] 非数字X [^[:xdigit:]] 非十六进制数字P [^[:print:]] 非可打印字符

  • 还可以使用以下特殊字符换码序列:

    - 回车 - 换行

    • 退格 - 制表符v - 垂直制表符" - 双引号' - 单引号


正则表达式是由普通字符(如字符A到字符Z)和特殊字符(称为元字符)组成。该模式描述在查找文字主题时要匹配的一个或多个字符串。正则表达式作为一个模板,将一个字符模式与搜索的字符串相匹配。如:

JScriptVBScript匹配
/^[ ]$/"^[ ]$"匹配一个空白行。
/d{2}-d{5}/"d{2}-d{5}"验证一个ID 号码是否由一个2位数字,一个连字符以及一个5位数字组成。
/<(.)>.</1>/"<(.)>.</1>"匹配一个 HTML 标记。

下表是元字符及其在正则表达式上下文中的行为的一个完整列表:
字符描述
将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。' ' 匹配一个换行符。序列 '' 匹配 "" 而 "(" 则匹配 "("。
^匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ' ' 或 ' ' 之后的位置。
$匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ' ' 或 ' ' 之前的位置。
*匹配前面的子表达式零次或多次。例如,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'。
.匹配除 " " 之外的任何单个字符。要匹配包括 ' ' 在内的任何字符,请使用象 '[. ]' 的模式。
(pattern)匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0$9 属性。要匹配圆括号字符,请使用 '(' 或 ')'。
(?:pattern)匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
(?=pattern)正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern)负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
x|y匹配 xy。例如,'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' 范围内的任意字符。
匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
B匹配非单词边界。'erB' 能匹配 "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。
匹配一个换行符。等价于 x0a 和 cJ。
匹配一个回车符。等价于 x0d 和 cM。
s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ f v]。
S匹配任何非空白字符。等价于 [^ f v]。
匹配一个制表符。等价于 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),且 ml 均为八进制数字 (0-7),则匹配八进制转义值 nml。
un匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, u00A9 匹配版权符号 (©)。


下面看几个例子:

"^The":表示所有以"The"开始的字符串("There","The cat"等); "of despair$":表示所以以"of despair"结尾的字符串; "^abc$":表示开始和结尾都是"abc"的字符串——呵呵,只有"abc"自己了; "notice":表示任何包含"notice"的字符串。 

'','+'和'?'这三个符号,表示一个或一序列字符重复出现的次数。它们分别表示“没有或更多”,“一次或更多”还有“没有或一次”。下面是几个例子:

"ab":表示一个字符串有一个a后面跟着零个或若干个b。("a", "ab", "abbb",……); "ab+":表示一个字符串有一个a后面跟着至少一个b或者更多; "ab?":表示一个字符串有一个a后面跟着零个或者一个b; "a?b+$":表示在字符串的末尾有零个或一个a跟着一个或几个b。也可以使用范围,用大括号括起,用以表示重复次数的范围。"ab{2}":表示一个字符串有一个a跟着2个b("abb"); "ab{2,}":表示一个字符串有一个a跟着至少2个b; "ab{3,5}":表示一个字符串有一个a跟着3到5个b。请注意,你必须指定范围的下限(如:"{0,2}"而不是"{,2}")。还有,你可能注意到了,'','+'和'?'相当于"{0,}","{1,}"和"{0,1}"。 


还有一个'¦',表示“或”操作:

"hi¦hello":表示一个字符串里有"hi"或者"hello"; "(b¦cd)ef":表示"bef"或"cdef"; "(a¦b)c":表示一串"a""b"混合的字符串后面跟一个"c";

'.'可以替代任何字符:

"a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字; "^.{3}$":表示有任意三个字符的字符串(长度为3个字符);方括号表示某些字符允许在一个字符串中的某一特定位置出现:"[ab]":表示一个字符串有一个"a"或"b"(相当于"a¦b"); "[a-d]":表示一个字符串包含小写的'a'到'd'中的一个(相当于"a¦b¦c¦d"或者"[abcd]"); "^[a-zA-Z]":表示一个以字母开头的字符串; "[0-9]%":表示一个百分号前有一位的数字; ",[a-zA-Z0-9]$":表示一个字符串以一个逗号后面跟着一个字母或数字结束。

你也可以在方括号里用'^'表示不希望出现的字符,'^'应在方括号里的第一位。(如:"%[^a-zA-Z]%"表示两个百分号中不应该出现字母)。

为了逐字表达,必须在"^.$()¦+?{"这些字符前加上转义字符''。

请注意在方括号中,不需要转义字符。

什么是正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

什么是正则表达式

给定一个正则表达式和另一个字符串,我们可以达到如下的目的:

  1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
  2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。


正则表达式的特点

  1. 灵活性、逻辑性和功能性非常的强;
  2. 可以迅速地用极简单的方式达到字符串的复杂控制。
  3. 对于刚接触的人来说,比较晦涩难懂。


由于正则表达式主要应用对象是文本,因此它在各种文本编辑器场合都有应用,小到著名编辑器EditPlus,大到Microsoft Word、Visual Studio等大型编辑器,都可以使用正则表达式来处理文本内容。


正则表达式的标准

大体来讲,正则表达式的文法分为3种标准:

  • BRE
  • ERE
  • ARE

其中 BRE 和 ERE 属于 POSIX 标准,ARE 则是由各家定义的扩展。

POSIX 正则表达式
传统上,POSIX 定义了两种正则表达式语法, 即:基本正则表达式(BRE)和扩展正则表  达式(ERE)。

其中, BRE 定义的语法符号包括:

. - 匹配任意一个字符。 [] - 字符集匹配,匹配方括号中定义的字符集之一。 [^] - 字符集否定匹配,匹配没有在方括号中定义的字符。 ^ - 匹配开始位置。 $ - 匹配结束位置。 () - 定义子表达式。 - 子表达式向前引用,n 为 1-9 之间的数字。 由于此功能已超出正则语义,需 要在字符串中回溯,因此需要使用 NFA 算法进行匹配。

    • 任意次匹配(零次或多次匹配)。{m,n} - 至少 m 次,至多 n 次匹配;{m} 表示 m 次精确匹配;{m,} 表示至少 m次匹配。

    ERE 修改了 BRE 中的部分语法,并增加了以下语法符号:

    ? - 最多一次匹配(零次或一次匹配)。

    • 至少一次匹配(一次或更多次匹配)。| - 或运算,其左右操作数均可以为一个子表达式。

    同时,ERE 取消了子表达式 "()" 和 次数匹配 "{m,n}" 语法符号的转义符引用语法,在使用这两种语法符号时,不在需要添加转义符。 与此同时, ERE 也取消了非正则语义的子表达式向前引用能力。

    BRE 和 ERE 共享同样的 POSIX 字符类定义。同时,它们还支持字符类比较操作 "[. .]"和字符类等效体 "[= =]" 操作,但很少被使用。

    f / fr / wfr / bwfr 等工具默认使用 ERE 模式,同时支持以下 perl 风格的字符类:

    POSIX 类 perl类 描述

    [:alnum:] 字母和数字[:alpha:] a 字母[:lower:] l 小写字母[:upper:] u 大写字母[:blank:] 空白字符(空格和制表符)[:space:] s 所有空格符(比[:blank:]包含的范围广)[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)[:digit:] d 十进制数字[:xdigit:] x 十六进制数字[:graph:] 可打印的非空白字符[:print:] p 可打印字符[:punct:] 标点符号

  • 此外,还有以下特殊字符类:

    perl类 等效POSIX表达式 描述

    o [0-7] 八进制数字O [^0-7] 非八进制数字w [[:alnum:]] 单词构成字符W [^[:alnum:]] 非单词构成字符A [^[:alpha:]] 非字母L [^[:lower:]] 非小写字母U [^[:upper:]] 非大写字母S [^[:space:]] 非空格符D [^[:digit:]] 非数字X [^[:xdigit:]] 非十六进制数字P [^[:print:]] 非可打印字符

  • 还可以使用以下特殊字符换码序列:

    - 回车 - 换行

    • 退格 - 制表符v - 垂直制表符" - 双引号' - 单引号


正则表达式是由普通字符(如字符A到字符Z)和特殊字符(称为元字符)组成。该模式描述在查找文字主题时要匹配的一个或多个字符串。正则表达式作为一个模板,将一个字符模式与搜索的字符串相匹配。如:

JScriptVBScript匹配
/^[ ]$/"^[ ]$"匹配一个空白行。
/d{2}-d{5}/"d{2}-d{5}"验证一个ID 号码是否由一个2位数字,一个连字符以及一个5位数字组成。
/<(.)>.</1>/"<(.)>.</1>"匹配一个 HTML 标记。

下表是元字符及其在正则表达式上下文中的行为的一个完整列表:
字符描述
将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。' ' 匹配一个换行符。序列 '' 匹配 "" 而 "(" 则匹配 "("。
^匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ' ' 或 ' ' 之后的位置。
$匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ' ' 或 ' ' 之前的位置。
*匹配前面的子表达式零次或多次。例如,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'。
.匹配除 " " 之外的任何单个字符。要匹配包括 ' ' 在内的任何字符,请使用象 '[. ]' 的模式。
(pattern)匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0$9 属性。要匹配圆括号字符,请使用 '(' 或 ')'。
(?:pattern)匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
(?=pattern)正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern)负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
x|y匹配 xy。例如,'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' 范围内的任意字符。
匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
B匹配非单词边界。'erB' 能匹配 "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。
匹配一个换行符。等价于 x0a 和 cJ。
匹配一个回车符。等价于 x0d 和 cM。
s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ f v]。
S匹配任何非空白字符。等价于 [^ f v]。
匹配一个制表符。等价于 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),且 ml 均为八进制数字 (0-7),则匹配八进制转义值 nml。
un匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, u00A9 匹配版权符号 (©)。


下面看几个例子:

"^The":表示所有以"The"开始的字符串("There","The cat"等); "of despair$":表示所以以"of despair"结尾的字符串; "^abc$":表示开始和结尾都是"abc"的字符串——呵呵,只有"abc"自己了; "notice":表示任何包含"notice"的字符串。 

'','+'和'?'这三个符号,表示一个或一序列字符重复出现的次数。它们分别表示“没有或更多”,“一次或更多”还有“没有或一次”。下面是几个例子:

"ab":表示一个字符串有一个a后面跟着零个或若干个b。("a", "ab", "abbb",……); "ab+":表示一个字符串有一个a后面跟着至少一个b或者更多; "ab?":表示一个字符串有一个a后面跟着零个或者一个b; "a?b+$":表示在字符串的末尾有零个或一个a跟着一个或几个b。也可以使用范围,用大括号括起,用以表示重复次数的范围。"ab{2}":表示一个字符串有一个a跟着2个b("abb"); "ab{2,}":表示一个字符串有一个a跟着至少2个b; "ab{3,5}":表示一个字符串有一个a跟着3到5个b。请注意,你必须指定范围的下限(如:"{0,2}"而不是"{,2}")。还有,你可能注意到了,'','+'和'?'相当于"{0,}","{1,}"和"{0,1}"。 


还有一个'¦',表示“或”操作:

"hi¦hello":表示一个字符串里有"hi"或者"hello"; "(b¦cd)ef":表示"bef"或"cdef"; "(a¦b)c":表示一串"a""b"混合的字符串后面跟一个"c";

'.'可以替代任何字符:

"a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字; "^.{3}$":表示有任意三个字符的字符串(长度为3个字符);方括号表示某些字符允许在一个字符串中的某一特定位置出现:"[ab]":表示一个字符串有一个"a"或"b"(相当于"a¦b"); "[a-d]":表示一个字符串包含小写的'a'到'd'中的一个(相当于"a¦b¦c¦d"或者"[abcd]"); "^[a-zA-Z]":表示一个以字母开头的字符串; "[0-9]%":表示一个百分号前有一位的数字; ",[a-zA-Z0-9]$":表示一个字符串以一个逗号后面跟着一个字母或数字结束。

你也可以在方括号里用'^'表示不希望出现的字符,'^'应在方括号里的第一位。(如:"%[^a-zA-Z]%"表示两个百分号中不应该出现字母)。

为了逐字表达,必须在"^.$()¦+?{"这些字符前加上转义字符''。

请注意在方括号中,不需要转义字符。

一、正则表达式基本语法


两个特殊的符号'^''$'。他们的作用是分别指出一个字符串的开始和结束。例子如下:

"^The":表示所有以"The"开始的字符串("There","The cat"等);"of despair$":表示所以以"of despair"结尾的字符串;"^abc$":表示开始和结尾都是"abc"的字符串——呵呵,只有"abc"自己了;"notice":表示任何包含"notice"的字符串。

象最后那个例子,如果你不使用两个特殊字符,你就在表示要查找的串在被查找串的任意部分——你并不把它定位在某一个顶端。

其它还有'*''+''?'这三个符号,表示一个或一序列字符重复出现的次数。它们分别表示没有或更多一次或更多还有没有或一次。下面是几个例子:

"ab*":表示一个字符串有一个a后面跟着零个或若干个b。("a", "ab", "abbb",……);"ab+":表示一个字符串有一个a后面跟着至少一个b或者更多;"ab?":表示一个字符串有一个a后面跟着零个或者一个b;"a?b+$":表示在字符串的末尾有零个或一个a跟着一个或几个b。

你也可以使用范围,用大括号括起,用以表示重复次数的范围。

"ab{2}":表示一个字符串有一个a跟着2个b("abb");"ab{2,}":表示一个字符串有一个a跟着至少2个b;"ab{3,5}":表示一个字符串有一个a跟着3到5个b。

请注意,你必须指定范围的下限(如:"{0,2}"而不是"{,2}")。还有,你可能注意到了,'*''+'
'?'相当于"{0,}""{1,}""{0,1}"
还有一个'¦',表示操作:

"hi¦hello":表示一个字符串里有"hi"或者"hello";"(b¦cd)ef":表示"bef"或"cdef";"(a¦b)*c":表示一串"a""b"混合的字符串后面跟一个"c";

'.'可以替代任何字符:

"a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字;"^.{3}$":表示有任意三个字符的字符串(长度为3个字符);方括号表示某些字符允许在一个字符串中的某一特定位置出现:"[ab]":表示一个字符串有一个"a"或"b"(相当于"a¦b");"[a-d]":表示一个字符串包含小写的'a'到'd'中的一个(相当于"a¦b¦c¦d"或者"[abcd]");"^[a-zA-Z]":表示一个以字母开头的字符串;"[0-9]%":表示一个百分号前有一位的数字;",[a-zA-Z0-9]$":表示一个字符串以一个逗号后面跟着一个字母或数字结束。


你也可以在方括号里用'^'表示不希望出现的字符,'^'应在方括号里的第一位。(如:"%[^a-zA-Z]%"
示两个百分号中不应该出现字母)。

为了逐字表达,你必须在"^.$()¦*+?{"这些字符前加上转移字符''

请注意在方括号中,不需要转义字符。

二、正则表达式验证控制文本框的输入字符类型

1.只能输入数字和英文的: 

<input onkeyup="value=value.replace(/[W]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))" ID="Text1" NAME="Text1">

2.只能输入数字的: 

<input onkeyup="value=value.replace(/[^d]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))" ID="Text2" NAME="Text2">

3.只能输入全角的: 

<input onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))" ID="Text3" NAME="Text3">

4.只能输入汉字的: 

<input onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))" ID="Text4" NAME="Text4">

三、正则表达式的应用实例通俗说明

*******************************************************************************

//校验是否全由数字组成/^[0-9]{1,20}$/ ^ 表示打头的字符要匹配紧跟^后面的规则$ 表示打头的字符要匹配紧靠$前面的规则[ ] 中的内容是可选字符集[0-9] 表示要求字符范围在0-9之间{1,20}表示数字字符串长度合法为1到20,即为[0-9]中的字符出现次数的范围是1到20次。 /^ 和 $/成对使用应该是表示要求整个字符串完全匹配定义的规则,而不是只匹配字符串中的一个子串。

*******************************************************************************

//校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/ ^[a-zA-Z]{1} 表示第一个字符要求是字母。([a-zA-Z0-9]|[._]){4,19} 表示从第二位开始(因为它紧跟在上个表达式后面)的一个长度为4到19位的字符串,它要求是由大小写字母、数字或者特殊字符集[._]组成。
 

*******************************************************************************

//校验用户姓名:只能输入1-30个以字母开头的字串/^[a-zA-Z]{1,30}$/

*******************************************************************************

//校验密码:只能输入6-20个字母、数字、下划线/^(w){6,20}$/ w:用于匹配字母,数字或下划线字符


*******************************************************************************

//校验普通电话、传真号码:可以“+”或数字开头,可含有“-” 和 “ ”/^[+]{0,1}(d){1,3}[ ]?([-]?((d)|[ ]){1,12})+$/ d:用于匹配从0到9的数字;“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次 可以匹配的字符串如:+123 -999 999 ; +123-999 999 ;123 999 999 ;+123 999999等

*******************************************************************************

//校验URL/^http[s]{0,1}://.+$/ 或 /^http[s]{0,1}://.{1,n}$/ (表示url串的长度为length(“https://”) + n )  / :表示字符“/”。. 表示所有字符的集+ 等同于{1,},就是1到正无穷吧。


*******************************************************************************

//校验纯中文字符/^[u4E00-u9FA5]+$/ [u4E00-u9FA5] :估计是中文字符集的范围吧 以上表达式均在下面的javascript中测试通过 <html><script language="JavaScript"><!--function regx(r,s){       if (r == null || r == ""){              return false;       }       var patrn= new RegExp(r);       if (patrn.exec(s))              return true       return false} --></script><body><form>       规则表达式 : <input type="input" name="regxStr" value="" > (填写/ /之间的表达式)<br>       校验字符串 : <input type="input" name="str" value="" >        <input type="button" name="match" value="匹配" onClick="alert(regx(regxStr.value,str.value));"></form></body></html>

四、正则表达式的应用

"^d+$"  //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$"  //正整数 "^((-d+)|(0+))$"  //非正整数(负整数 + 0) "^-[0-9]*[1-9][0-9]*$"  //负整数 "^-?d+$"    //整数 "^d+(.d+)?$"  //非负浮点数(正浮点数 + 0) "^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数 "^((-d+(.d+)?)|(0+(.0+)?))$"  //非正浮点数(负浮点数 + 0) "^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数 "^(-?d+)(.d+)?$"  //浮点数 "^[A-Za-z]+$"  //由26个英文字母组成的字符串 "^[A-Z]+$"  //由26个英文字母的大写组成的字符串 "^[a-z]+$"  //由26个英文字母的小写组成的字符串 "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串 "^w+$"  //由数字、26个英文字母或者下划线组成的字符串 "^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$"    //email地址 "^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$"  //url/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/   //  年-月-日/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/   // 月/日/年"^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"   //Emil"(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?"     //电话号码"^(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地址^([0-9A-F]{2})(-[0-9A-F]{2}){5}$   //MAC地址的正则表达式^[-+]?d+(.d+)?$  //值类型正则表达式

五、javascript正则表达式检验

//校验是否全由数字组成function isDigit(s){var patrn=/^[0-9]{1,20}$/;if (!patrn.exec(s)) return falsereturn true}

//校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串function isRegisterUserName(s){var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/;if (!patrn.exec(s)) return falsereturn true}

//校验用户姓名:只能输入1-30个以字母开头的字串function isTrueName(s){var patrn=/^[a-zA-Z]{1,30}$/;if (!patrn.exec(s)) return falsereturn true}

//校验密码:只能输入6-20个字母、数字、下划线function isPasswd(s){var patrn=/^(w){6,20}$/;if (!patrn.exec(s)) return falsereturn true}

//校验普通电话、传真号码:可以“+”开头,除数字外,可含有“-”function isTel(s){//var patrn=/^[+]{0,1}(d){1,3}[ ]?([-]?(d){1,12})+$/;var patrn=/^[+]{0,1}(d){1,3}[ ]?([-]?((d)|[ ]){1,12})+$/;if (!patrn.exec(s)) return falsereturn true}

//校验手机号码:必须以数字开头,除数字外,可含有“-”function isMobil(s){var patrn=/^[+]{0,1}(d){1,3}[ ]?([-]?((d)|[ ]){1,12})+$/;if (!patrn.exec(s)) return falsereturn true}

//校验邮政编码function isPostalCode(s){//var patrn=/^[a-zA-Z0-9]{3,12}$/;var patrn=/^[a-zA-Z0-9 ]{3,12}$/;if (!patrn.exec(s)) return falsereturn true}

//校验搜索关键字function isSearch(s){var patrn=/^[^`~!@#$%^&*()+=|\][]{}:;',.<>/?]{1}[^`~!@$%^&()+=|\][]{}:;',.<>?]{0,19}$/;if (!patrn.exec(s)) return falsereturn true}function isIP(s) //by zergling{var patrn=/^[0-9.]{1,20}$/;if (!patrn.exec(s)) return falsereturn true}
/********************************************************************************** FUNCTION: isBetween* PARAMETERS: val AS any value* lo AS Lower limit to check* hi AS Higher limit to check* CALLS: NOTHING* RETURNS: TRUE if val is between lo and hi both inclusive, otherwise false.**********************************************************************************/function isBetween (val, lo, hi) {if ((val < lo) || (val > hi)) { return(false); }else { return(true); }}/********************************************************************************** FUNCTION: isDate checks a valid date* PARAMETERS: theStr AS String* CALLS: isBetween, isInt* RETURNS: TRUE if theStr is a valid date otherwise false.**********************************************************************************/function isDate (theStr) {var the1st = theStr.indexOf('-');var the2nd = theStr.lastIndexOf('-');if (the1st == the2nd) { return(false); }else {var y = theStr.substring(0,the1st);var m = theStr.substring(the1st+1,the2nd);var d = theStr.substring(the2nd+1,theStr.length);var maxDays = 31;if (isInt(m)==false || isInt(d)==false || isInt(y)==false) {return(false); }else if (y.length < 4) { return(false); }else if (!isBetween (m, 1, 12)) { return(false); }else if (m==4 || m==6 || m==9 || m==11) maxDays = 30;else if (m==2) {if (y % 4 > 0) maxDays = 28;else if (y % 100 == 0 && y % 400 > 0) maxDays = 28;else maxDays = 29;}if (isBetween(d, 1, maxDays) == false) { return(false); }else { return(true); }}}/********************************************************************************** FUNCTION: isEuDate checks a valid date in British format* PARAMETERS: theStr AS String* CALLS: isBetween, isInt* RETURNS: TRUE if theStr is a valid date otherwise false.**********************************************************************************/function isEuDate (theStr) {if (isBetween(theStr.length, 8, 10) == false) { return(false); }else {var the1st = theStr.indexOf('/');var the2nd = theStr.lastIndexOf('/');if (the1st == the2nd) { return(false); }else {var m = theStr.substring(the1st+1,the2nd);var d = theStr.substring(0,the1st);var y = theStr.substring(the2nd+1,theStr.length);var maxDays = 31;if (isInt(m)==false || isInt(d)==false || isInt(y)==false) {return(false); }else if (y.length < 4) { return(false); }else if (isBetween (m, 1, 12) == false) { return(false); }else if (m==4 || m==6 || m==9 || m==11) maxDays = 30;else if (m==2) {if (y % 4 > 0) maxDays = 28;else if (y % 100 == 0 && y % 400 > 0) maxDays = 28;else maxDays = 29;}if (isBetween(d, 1, maxDays) == false) { return(false); }else { return(true); }}}}/********************************************************************************* FUNCTION: Compare Date! Which is the latest!* PARAMETERS: lessDate,moreDate AS String* CALLS: isDate,isBetween* RETURNS: TRUE if lessDate<moreDate*********************************************************************************/function isComdate (lessDate , moreDate){if (!isDate(lessDate)) { return(false);}if (!isDate(moreDate)) { return(false);}var less1st = lessDate.indexOf('-');var less2nd = lessDate.lastIndexOf('-');var more1st = moreDate.indexOf('-');var more2nd = moreDate.lastIndexOf('-');var lessy = lessDate.substring(0,less1st);var lessm = lessDate.substring(less1st+1,less2nd);var lessd = lessDate.substring(less2nd+1,lessDate.length);var morey = moreDate.substring(0,more1st);var morem = moreDate.substring(more1st+1,more2nd);var mored = moreDate.substring(more2nd+1,moreDate.length);var Date1 = new Date(lessy,lessm,lessd); var Date2 = new Date(morey,morem,mored); if (Date1>Date2) { return(false);}return(true);}/********************************************************************************** FUNCTION isEmpty checks if the parameter is empty or null* PARAMETER str AS String**********************************************************************************/function isEmpty (str) {if ((str==null)||(str.length==0)) return true;else return(false);}/********************************************************************************** FUNCTION: isInt* PARAMETER: theStr AS String * RETURNS: TRUE if the passed parameter is an integer, otherwise FALSE* CALLS: isDigit**********************************************************************************/function isInt (theStr) {var flag = true;if (isEmpty(theStr)) { flag=false; }else{ for (var i=0; i<theStr.length; i++) {if (isDigit(theStr.substring(i,i+1)) == false) {flag = false; break;}}}return(flag);}/********************************************************************************** FUNCTION: isReal* PARAMETER: heStr AS String decLen AS Integer (how many digits after period)* RETURNS: TRUE if theStr is a float, otherwise FALSE* CALLS: isInt**********************************************************************************/function isReal (theStr, decLen) {var dot1st = theStr.indexOf('.');var dot2nd = theStr.lastIndexOf('.');var OK = true;if (isEmpty(theStr)) return false;if (dot1st == -1) {if (!isInt(theStr)) return(false);else return(true);}else if (dot1st != dot2nd) return (false);else if (dot1st==0) return (false);else {var intPart = theStr.substring(0, dot1st);var decPart = theStr.substring(dot2nd+1);if (decPart.length > decLen) return(false);else if (!isInt(intPart) || !isInt(decPart)) return (false);else if (isEmpty(decPart)) return (false);else return(true);}}/********************************************************************************** FUNCTION: isEmail* PARAMETER: String (Email Address)* RETURNS: TRUE if the String is a valid Email address* FALSE if the passed string is not a valid Email Address* EMAIL FORMAT: AnyName@EmailServer e.g; webmaster@hotmail.com* @ sign can appear only once in the email address.*********************************************************************************/function isEmail (theStr) {var atIndex = theStr.indexOf('@');var dotIndex = theStr.indexOf('.', atIndex);var flag = true;theSub = theStr.substring(0, dotIndex+1)if ((atIndex < 1)||(atIndex != theStr.lastIndexOf('@'))||(dotIndex < atIndex + 2)||(theStr.length <= theSub.length)) { return(false); }else { return(true); }}/********************************************************************************** FUNCTION: newWindow* PARAMETERS: doc -> Document to open in the new windowhite -> Height of the new windowwide -> Width of the new windowbars -> 1-Scroll bars = YES 0-Scroll Bars = NOresize -> 1-Resizable = YES 0-Resizable = NO* CALLS: NONE* RETURNS: New window instance**********************************************************************************/function newWindow (doc, hite, wide, bars, resize) {var winNew="_blank";var opt="toolbar=0,location=0,directories=0,status=0,menubar=0,";opt+=("scrollbars="+bars+",");opt+=("resizable="+resize+",");opt+=("width="+wide+",");opt+=("height="+hite);winHandle=window.open(doc,winNew,opt);return;}/********************************************************************************** FUNCTION: DecimalFormat* PARAMETERS: paramValue -> Field value* CALLS: NONE* RETURNS: Formated string**********************************************************************************/function DecimalFormat (paramValue) {var intPart = parseInt(paramValue);var decPart =parseFloat(paramValue) - intPart;str = "";if ((decPart == 0) || (decPart == null)) str += (intPart + ".00");else str += (intPart + decPart);return (str);} "^d+$"  //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$"  //正整数 "^((-d+)|(0+))$"  //非正整数(负整数 + 0) "^-[0-9]*[1-9][0-9]*$"  //负整数 "^-?d+$"    //整数 "^d+(.d+)?$"  //非负浮点数(正浮点数 + 0) "^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数 "^((-d+(.d+)?)|(0+(.0+)?))$"  //非正浮点数(负浮点数 + 0) "^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数 "^(-?d+)(.d+)?$"  //浮点数 "^[A-Za-z]+$"  //由26个英文字母组成的字符串 "^[A-Z]+$"  //由26个英文字母的大写组成的字符串 "^[a-z]+$"  //由26个英文字母的小写组成的字符串 "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串 "^w+$"  //由数字、26个英文字母或者下划线组成的字符串 "^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$"    //email地址 "^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$"  //url

一、JAVA正则表达式语法示例


1、匹配验证-验证Email是否正确

public static void main(String[] args) {    // 要验证的字符串    String str = "service@xsoftlab.net";    // 邮箱验证规则    String regEx = "[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}.){1,3}[a-zA-z-]{1,}";    // 编译正则表达式    Pattern pattern = Pattern.compile(regEx);    // 忽略大小写的写法    // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);    Matcher matcher = pattern.matcher(str);    // 字符串是否与正则表达式相匹配    boolean rs = matcher.matches();    System.out.println(rs);}

2、在字符串中查询字符或者字符串

public static void main(String[] args) {    // 要验证的字符串    String str = "baike.xsoftlab.net";    // 正则表达式规则    String regEx = "baike.*";    // 编译正则表达式    Pattern pattern = Pattern.compile(regEx);    // 忽略大小写的写法    // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);    Matcher matcher = pattern.matcher(str);    // 查找字符串中是否有匹配正则表达式的字符/字符串    boolean rs = matcher.find();    System.out.println(rs);}

3、更多。。。

[正则表达式]文本框输入内容控制整数或者小数:^[0-9]+.{0,1}[0-9]{0,2}$只能输入数字:"^[0-9]*$"。只能输入n位的数字:"^d{n}$"。只能输入至少n位的数字:"^d{n,}$"。只能输入m~n位的数字:。"^d{m,n}$"只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。只能输入非零的正整数:"^+?[1-9][0-9]*$"。只能输入非零的负整数:"^-[1-9][]0-9"*$。只能输入长度为3的字符:"^.{3}$"。只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。只能输入由数字、26个英文字母或者下划线组成的字符串:"^w+$"。验证用户密码:"^[a-zA-Z]w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。验证是否含有^%&',;=?$"等字符:"[^%&',;=?$x22]+"。只能输入汉字:"^[u4e00-u9fa5]{0,}$"验证Email地址:"^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$"。验证InternetURL:"^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$"。验证电话号码:"^((d{3,4}-)|d{3.4}-)?d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。验证身份证号(15位或18位数字):"^d{15}|d{18}$"。验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。匹配中文字符的正则表达式: [u4e00-u9fa5]匹配双字节字符(包括汉字在内):[^x00-xff]应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)String.prototype.len=function(){return this.replace(/[^x00-xff]/g,"aa").length;}匹配空行的正则表达式:
[s| ]*
匹配html标签的正则表达式:<(.*)>(.*)</(.*)>|<(.*)/>匹配首尾空格的正则表达式:(^s*)|(s*$)应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:String.prototype.trim = function(){return this.replace(/(^s*)|(s*$)/g, "");}利用正则表达式分解和转换IP地址:下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:function IP2V(ip){re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正则表达式if(re.test(ip)){return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1}else{throw new Error("Not a valid IP address!")}}不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:var ip="10.100.20.168"ip=ip.split(".")alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?利用正则表达式限制网页表单里的文本框输入内容:用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))"用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))"用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"<input onkeyup="value=value.replace(/[^u4E00-u9FA5w]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5w]/g,''))" value="允许下划线,数字字母和汉字"><script language="javascript">if (document.layers)//触发键盘事件document.captureEvents(Event.KEYPRESS)function xz(thsv,nob){if(nob=="2"){window.clipboardData.setData("text","")alert("避免非法字符输入,请勿复制字符");return false;}if (event.keyCode!=8 && event.keyCode!=16 && event.keyCode!=37 && event.keyCode!=38 && event.keyCode!=39 && event.keyCode!=40){thsvv=thsv.value;//输入的值thsvs=thsvv.substring(thsvv.length-1);//输入的最后一个字符//thsvss=thsvv.substring(0,thsvv.length-1);//去掉最后一个错误字符if (!thsvs.replace(/[^u4E00-u9FA5w]/g,'') || event.keyCode==189){//正则除去符号和下划线 keythsv.value='请勿输入非法符号 ['+thsvs+']';alert('请勿输入非法符号 ['+thsvs+']');thsv.value="";return false;}}}</script><input onkeyup="xz(this,1)" onPaste="xz(this,2)" value="">允许数字字母和汉字<script language="javascript"><!--function MaxLength(field,maxlimit){var j = field.value.replace(/[^x00-xff]/g,"**").length;//alert(j);var tempString=field.value;var tt="";if(j > maxlimit){for(var i=0;i<maxlimit;i++){if(tt.replace(/[^x00-xff]/g,"**").length < maxlimit)tt = tempString.substr(0,i+1);elsebreak;}if(tt.replace(/[^x00-xff]/g,"**").length > maxlimit)tt=tt.substr(0,tt.length-1);field.value = tt;}else{;}}</script>单行文本框控制<br /><INPUT type="text" id="Text1" name="Text1" onpropertychange="MaxLength(this, 5)"><br />多行文本框控制:<br /><TEXTAREA rows="14"cols="39" id="Textarea1" name="Textarea1" onpropertychange="MaxLength(this, 15)"></TEXTAREA><br />控制表单内容只能输入数字,中文....<script>function test()  {if(document.a.b.value.length>50){alert("不能超过50个字符!");document.a.b.focus();return false;}}</script><form name=a onsubmit="return test()"><textarea name="b" cols="40" wrap="VIRTUAL" rows="6"></textarea><input type="submit" name="Submit" value="check"></form>只能是汉字<input onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'')">只能是英文字符<script language=javascript>function onlyEng(){if(!(event.keyCode>=65&&event.keyCode<=90))    event.returnValue=false;}</script><input onkeydown="onlyEng();"><input name="coname" type="text" size="50" maxlength="35" class="input2" onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))">只能是数字<script language=javascript>function onlyNum(){if(!((event.keyCode>=48&&event.keyCode<=57)||(event.keyCode>=96&&event.keyCode<=105)))//考虑小键盘上的数字键    event.returnValue=false;}</script><input onkeydown="onlyNum();">只能是英文字符和数字<input onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))">验证为email格式<SCRIPT LANGUAGE=Javascript RUNAT=Server>function isEmail(strEmail) {if (strEmail.search(/^w+((-w+)|(.w+))*@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+)*.[A-Za-z0-9]+$/) != -1)
                
                    
这篇文章主要介绍了PowerShell常用正则表达式和语法参考,主要介绍PowerShell中的正则表达式和其含义,需要的朋友可以参考下本文介绍PowerShell中的正则表达式,各种不同的字符代表不同的含义,包括占位符PlaceHolder、量词Quantifier和边界字符。

下面列举PowerShell的正则表达式中可能出现的字符,以及它们表示的含义。


一、字符串的匹配符(占位符PlaceHolder)

. 这是一个点儿,表示换行符之外的任意一个字符(Any character except newline (Equivalent: [^
]))[^abc] 指定的字符(abc)之外的任意一个字符,可以把abc换成其它字符组。(All characters except the ones specified)[^a-z] 任意一个非小写字母的字符(All characters except those in the region specified)[abc] 指定的字符集中的任意一个,即abc中的任意一个(One of the characters)[a-z] 指定的字符范围中的任意一个,即任意一个小写字母。One of the characters in the regiona 响呤(Bell (ASCII 7))c Any character allowed in XML namescA-cZ Control+A to Control+Z, ASCII 1 to ASCII 26d 任意一个数字,等同于[0-9](Any number (Equivalent: [0-9]))D 任意一个非数字。Any non-numbere ESC键(Escape (ASCII 27))f Form Feed, (ASCII 12)
 换行Line break
 回车Carriage returns 任意一个空白键(空白键如tab,换行)Any whitespace (space, tab, new line)S 任意一个非空白字符(Any non-whitespace)	 tab键w 字母,数字和下划线(Letter, number or underline)W w的补集(Non-letter, number, or underline)

二、匹配次数(量词Quantifier)

* 出现零次、1次、多次(Any (no occurrence, once, many times))? 出现零次、1次(No occurrence or one occurrence){n,} 出现至少n次(At least n occurrences){n,m} 出现至少n次,最多m次(At least n occurrences, maximum m occurrences){n} 出现n次(Exactly n occurrences)+ 出现1次、多次(One or many occurrences)所有的匹配次数的符号,默认情况下都是贪婪的,即它将最大长度的进行匹配。如果想要得到最短的匹配,那就要在上面这组符号之后加一个问号(?)。

四、匹配边界

$ 字符串结束(End of text)^ 字符串开始(Start of text) Word boundaryB No word boundaryG After last match (no overlaps)

关于PowerShell正则表达式参考,本文就介绍这么多,希望对您有所帮助,谢谢!

replace()最js中比较简单的字符替换函数,但是它也是可以跟正则结合实现强大的字符替换效果。

示例代码如下:

 <script language="javascript"> var strM = "javascript is a good script language"; //在此我想将字母a替换成字母A alert(strM.replace("a","A")); </script> 
它只替换了首字母。但如果加上正则表达式结果就不一样了!replace()支持正则表达式,它可以按照正则表达式的规则匹配字符或字符串,然后给予替换! 

注意:被替换的部分不用加双引号。

 <script language="javascript"> var strM = "javascript is a good script language"; //在此我想将字母a替换成字母A alert(strM.replace(/a/,"A")); </script> 

这样还是只替换了第一个字母a。 
 <script language="javascript"> var strM = "javascript is a good script language"; //在此将字母a全部替换成字母A alert(strM.replace(/a/g,"A")); </script> 
由上可知,当正则表达式有"g"标志时,代表将处理整个字符串。

 <script language="javascript"> var strM = "javascript is a good script language"; alert(strM.replace(/(javascript)s*(is)/g,"$1 $2 fun. it $2")); </script> 
先看看简单例子:将所有单词首字母换成大写。 
 <script language="javascript"> var strM = "javascript is a good script language"; function change(word) { return word.indexOf(0).toUpperCase()+word.substring(1); } alert(strM.replace(/w+/g,change)); </script> 
由上可知,当正则表达式有"g"标志时,代表将处理整个字符串,即函数change的变换将应用于所有匹配的对象。而该函数有三个或更多参数,具体个数视正则表达式而定。 

有了函数与正则表达式的配合,replace()处理字符串的功能空前强大起来了! 

最后还举个例子,将字符串所有单词倒序,用replace()处理是如此简单。 
 <script language="javascript"> var strM = "javascript is a good script language"; function change(word) { var result = word.match(/(w)/g); if ( result ) { var str = ""; for ( var i=result.length-1; i>=0; i-- ) { str += result; } return str; } else { return "null"; } } alert(strM.replace(/(w)+/g,change)); </script> 




特殊表达式 :


货币格式: '123123211312.333333'.replace(/(?=(?!^)(?:d{3})+(?:.|$))(d{3}(.d+$)?)/g, ',$1') //输出 123,123,211,312.333333  ps:TCL 大牛推荐


匹配中文字符的正则表达式: [u4e00-u9fa5]   
  评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 

匹配双字节字符(包括汉字在内):[^x00-xff] 
  评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 

匹配空白行的正则表达式:ns*r 
  评注:可以用来删除空白行 

匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?|<.*? /> 
  评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力 

匹配首尾空白字符的正则表达式:^s*|s*$ 
  评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式 

匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 
  评注:表单验证时很实用 

匹配网址URL的正则表达式:[a-zA-z]+://[^s]* 
  评注:网上流传的版本功能很有限,上面这个基本可以满足需求 

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 
  评注:表单验证时很实用 

匹配国内电话号码:d{3}-d{8}|d{4}-d{7} 
  评注:匹配形式如 0511-4405222 或 021-87888822 

匹配腾讯QQ号:[1-9][0-9]{4,} 
  评注:腾讯QQ号从10000开始 

匹配中国邮政编码:[1-9]d{5}(?!d) 
  评注:中国邮政编码为6位数字 

匹配身份证:d{15}|d{18} 
  评注:中国的身份证为15位或18位 

匹配ip地址:d+.d+.d+.d+ 
  评注:提取ip地址时有用 

匹配特定数字: 
  ^[1-9]d*$    //匹配正整数 
  ^-[1-9]d*$   //匹配负整数 
  ^-?[1-9]d*$   //匹配整数 
  ^[1-9]d*|0$  //匹配非负整数(正整数 + 0) 
  ^-[1-9]d*|0$   //匹配非正整数(负整数 + 0) 
  ^[1-9]d*.d*|0.d*[1-9]d*$   //匹配正浮点数 
  ^-([1-9]d*.d*|0.d*[1-9]d*)$  //匹配负浮点数 
  ^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$  //匹配浮点数 
  ^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$   //匹配非负浮点数(正浮点数 + 0) 
  ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$  //匹配非正浮点数(负浮点数 + 0) 
  评注:处理大量数据时有用,具体应用时注意修正 

匹配特定字符串: 
  ^[A-Za-z]+$  //匹配由26个英文字母组成的字符串 
  ^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串 
  ^[a-z]+$  //匹配由26个英文字母的小写组成的字符串 
  ^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串 
  ^w+$  //匹配由数字、26个英文字母或者下划线组成的字符串 

在使用RegularExpressionValidator验证控件时的验证功能及其验证表达式介绍如下: 
  只能输入数字:“^[0-9]*$” 
  只能输入n位的数字:“^d{n}$” 
  只能输入至少n位数字:“^d{n,}$” 
  只能输入m-n位的数字:“^d{m,n}$” 
  只能输入零和非零开头的数字:“^(0|[1-9][0-9]*)$” 
  只能输入有两位小数的正实数:“^[0-9]+(.[0-9]{2})?$” 
  只能输入有1-3位小数的正实数:“^[0-9]+(.[0-9]{1,3})?$” 
  只能输入非零的正整数:“^+?[1-9][0-9]*$” 
  只能输入非零的负整数:“^-[1-9][0-9]*$” 
  只能输入长度为3的字符:“^.{3}$” 
  只能输入由26个英文字母组成的字符串:“^[A-Za-z]+$” 
  只能输入由26个大写英文字母组成的字符串:“^[A-Z]+$” 
  只能输入由26个小写英文字母组成的字符串:“^[a-z]+$” 
  只能输入由数字和26个英文字母组成的字符串:“^[A-Za-z0-9]+$” 
  只能输入由数字、26个英文字母或者下划线组成的字符串:“^w+$” 

验证用户密码:“^[a-zA-Z]w{5,17}$”正确格式为:以字母开头,长度在6-18之间, 只能包含字符、数字和下划线。 

验证是否含有^%&'',;=?$"等字符:“[^%&'',;=?$x22]+” 

只能输入汉字:“^[u4e00-u9fa5],{0,}$” 


验证Email地址:“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$” 

验证InternetURL:“^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$” 

验证电话号码:“^((d{3,4})|d{3,4}-)?d{7,8}$” 
  正确格式为:“XXXX-XXXXXXX”,“XXXX-XXXXXXXX”,“XXX-XXXXXXX”, 
  “XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”。 

验证身份证号(15位或18位数字):“^d{15}|d{}18$” 

验证一年的12个月:“^(0?[1-9]|1[0-2])$”正确格式为:“01”-“09”和“1”“12” 

验证一个月的31天:“^((0?[1-9])|((1|2)[0-9])|30|31)$” 
  正确格式为:“01”“09”和“1”“31”。 

匹配中文字符的正则表达式: [u4e00-u9fa5] 

匹配双字节字符(包括汉字在内):[^x00-xff] 

匹配空行的正则表达式:n[s| ]*r 

匹配HTML标记的正则表达式:/<(.*)>.*|<(.*) />/ 

匹配首尾空格的正则表达式:(^s*)|(s*$) 

匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 

匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)? 
  (1)应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 
  String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").length;} 
  (2)应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现 
  String.prototype.trim = function() 
  { 
  return this.replace(/(^s*)|(s*$)/g, ""); 
  } 
  (3)应用:利用正则表达式分解和转换IP地址 
  function IP2V(ip) //IP地址转换成对应数值 
  { 
  re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正则表达式 
  if(re.test(ip)) 
  { 
  return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1 
  } 
  else 
  { 
  throw new Error("Not a valid IP address!") 
  } 
  } 
  (4)应用:从URL地址中提取文件名的javascript程序 
  s="http://www.9499.net/page1.htm"; 
  s=s.replace(/(.*/){0,}([^.]+).*/ig,"$2") ;//Page1.htm 
  (5)应用:利用正则表达式限制网页表单里的文本框输入内容 
  用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'') "onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^u4E00-u9FA5]/g,''))" 
  用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'') "onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^uFF00-uFFFF]/g,''))" 
  用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^d]/g,'') "onbeforepaste= "clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^d]/g,''))" 
  用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^d]/g,''

1.    平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用: 2.    "^d+$"  //非负整数(正整数 + 0) 3.    "^[0-9]*[1-9][0-9]*$"  //正整数 4.    "^((-d+)|(0+))$"  //非正整数(负整数 + 0) 5.    "^-[0-9]*[1-9][0-9]*$"  //负整数 6.    "^-?d+$"    //整数 7.    "^d+(.d+)?$"  //非负浮点数(正浮点数 + 0) 8.    "^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数 9.    "^((-d+(.d+)?)|(0+(.0+)?))$"  //非正浮点数(负浮点数 + 0) 10.    "^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数 11.    "^(-?d+)(.d+)?$"  //浮点数 12.    "^[A-Za-z]+$"  //由26个英文字母组成的字符串 13.    "^[A-Z]+$"  //由26个英文字母的大写组成的字符串 14.    "^[a-z]+$"  //由26个英文字母的小写组成的字符串 15.    "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串 16.    "^w+$"  //由数字、26个英文字母或者下划线组成的字符串 17.    "^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$"    //email地址 18.    "^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$"  //url 19.    /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/   //  年-月-日 20.    /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/   // 月/日/年 21.    "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"   //Emil 22.    /^((+?[0-9]{2,4}-[0-9]{3,4}-)|([0-9]{3,4}-))?([0-9]{7,8})(-[0-9]+)?$/     //电话号码 23.    "^(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地址 24.    25.    匹配中文字符的正则表达式: [u4e00-u9fa5] 26.    匹配双字节字符(包括汉字在内):[^x00-xff] 27.    匹配空行的正则表达式:
[s| ]*
 28.    匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/ 29.    匹配首尾空格的正则表达式:(^s*)|(s*$) 30.    匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 31.    匹配网址URL的正则表达式:^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$ 32.    匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 33.    匹配国内电话号码:(d{3}-|d{4}-)?(d{8}|d{7})? 34.    匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$ 35.    36.    37.    元字符及其在正则表达式上下文中的行为: 38.    39.     将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。 40.    41.    ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 ’
’ 或 ’
’ 之后的位置。 42.    43.    $ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性,$ 也匹配 ’
’ 或 ’
’ 之前的位置。 44.    45.    * 匹配前面的子表达式零次或多次。 46.    47.    + 匹配前面的子表达式一次或多次。+ 等价于 {1,}。 48.    49.    ? 匹配前面的子表达式零次或一次。? 等价于 {0,1}。 50.    51.    {n} n 是一个非负整数,匹配确定的n 次。 52.    53.    {n,} n 是一个非负整数,至少匹配n 次。 54.    55.    {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。 56.    57.    ? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。 58.    59.    . 匹配除 "
" 之外的任何单个字符。要匹配包括 ’
’ 在内的任何字符,请使用象 ’[.
]’ 的模式。 60.    (pattern) 匹配pattern 并获取这一匹配。 61.    62.    (?:pattern) 匹配pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。 63.    64.    (?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。 65.    66.    (?!pattern) 负向预查,与(?=pattern)作用相反 67.    68.    x|y 匹配 x 或 y。 69.    70.    [xyz] 字符集合。 71.    72.    [^xyz] 负值字符集合。 73.    74.    [a-z] 字符范围,匹配指定范围内的任意字符。 75.    76.    [^a-z] 负值字符范围,匹配任何不在指定范围内的任意字符。 77.    78.     匹配一个单词边界,也就是指单词和空格间的位置。 79.    80.    B 匹配非单词边界。 81.    82.    cx 匹配由x指明的控制字符。 83.    84.    d 匹配一个数字字符。等价于 [0-9]。 85.    86.    D 匹配一个非数字字符。等价于 [^0-9]。 87.    88.    f 匹配一个换页符。等价于 x0c 和 cL。 89.    90.    
 匹配一个换行符。等价于 x0a 和 cJ。 91.    92.    
 匹配一个回车符。等价于 x0d 和 cM。 93.    94.    s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ f

	v]。 95.    96.    S 匹配任何非空白字符。等价于 [^ f

	v]。 97.    98.    	 匹配一个制表符。等价于 x09 和 cI。 99.    100.    v 匹配一个垂直制表符。等价于 x0b 和 cK。 101.    102.    w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。 103.    104.    W 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。 105.    106.    xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。 107.    108.    
um 匹配 num,其中num是一个正整数。对所获取的匹配的引用。 109.    110.    
 标识一个八进制转义值或一个后向引用。如果 
 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。 111.    112.    
m 标识一个八进制转义值或一个后向引用。如果 
m 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 
m 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 
m 将匹配八进制转义值 nm。 113.    114.    
ml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。 115.    116.    un 匹配 n,其中 n 是一个用四个十六进制数字表示的Unicode字符。 117.    118.    匹配中文字符的正则表达式: [u4e00-u9fa5] 119.    120.    匹配双字节字符(包括汉字在内):[^x00-xff] 121.    122.    匹配空行的正则表达式:n[s| ]*r 123.    124.    匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/ 125.    126.    匹配首尾空格的正则表达式:(^s*)|(s*$) 127.    128.    匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 129.    130.    匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)? 131.    132.    利用正则表达式限制网页表单里的文本框输入内容: 133.    134.    用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))" 135.    136.    用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))" 137.    138.    用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))" 139.    140.    用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))" 141.    142.    =========常用正则式 143.    144.    145.    146.    匹配中文字符的正则表达式: [u4e00-u9fa5] 147.    148.    匹配双字节字符(包括汉字在内):[^x00-xff] 149.    150.    匹配空行的正则表达式:
[s| ]*
 151.    152.    匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/ 153.    154.    匹配首尾空格的正则表达式:(^s*)|(s*$) 155.    156.    匹配IP地址的正则表达式:/(d+).(d+).(d+).(d+)/g // 157.    158.    匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 159.    160.    匹配网址URL的正则表达式:http://(/[w-]+.)+[w-]+(/[w- ./?%&=]*)? 161.    162.    sql语句:^(select|drop|delete|create|update|insert).*$ 163.    164.    1、非负整数:^d+$ 165.    166.    2、正整数:^[0-9]*[1-9][0-9]*$ 167.    168.    3、非正整数:^((-d+)|(0+))$ 169.    170.    4、负整数:^-[0-9]*[1-9][0-9]*$ 171.    172.    5、整数:^-?d+$ 173.    174.    6、非负浮点数:^d+(.d+)?$ 175.    176.    7、正浮点数:^((0-9)+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$ 177.    178.    8、非正浮点数:^((-d+.d+)?)|(0+(.0+)?))$ 179.    180.    9、负浮点数:^(-((正浮点数正则式)))$ 181.    182.    10、英文字符串:^[A-Za-z]+$ 183.    184.    11、英文大写串:^[A-Z]+$ 185.    186.    12、英文小写串:^[a-z]+$ 187.    188.    13、英文字符数字串:^[A-Za-z0-9]+$ 189.    190.    14、英数字加下划线串:^w+$ 191.    192.    15、E-mail地址:^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$ 193.    194.    16、URL:^[a-zA-Z]+://(w+(-w+)*)(.(w+(-w+)*))*(?s*)?$ 195.    或:^http://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&_~`@[]':+!]*([^<>""])*$ 196.    197.    17、邮政编码:^[1-9]d{5}$ 198.    199.    18、中文:^[u0391-uFFE5]+$ 200.    201.    19、电话号码:^(((d{2,3}))|(d{3}-))?((0d{2,3})|0d{2,3}-)?[1-9]d{6,7}(-d{1,4})?$ 202.    203.    20、手机号码:^(((d{2,3}))|(d{3}-))?13d{9}$ 204.    205.    21、双字节字符(包括汉字在内):^x00-xff 206.    207.    22、匹配首尾空格:(^s*)|(s*$)(像vbscript那样的trim函数) 208.    209.    23、匹配HTML标记:<(.*)>.*</1>|<(.*) /> 210.    211.    24、匹配空行:
[s| ]*
 212.    213.    25、提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(w||/|.)+('|"| *|>)? 214.    215.    26、提取信息中的邮件地址:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 216.    217.    27、提取信息中的图片链接:(s|S)(r|R)(c|C) *= *('|")?(w||/|.)+('|"| *|>)? 218.    219.    28、提取信息中的IP地址:(d+).(d+).(d+).(d+) 220.    221.    29、提取信息中的中国手机号码:(86)*0*13d{9} 222.    223.    30、提取信息中的中国固定电话号码:((d{3,4})|d{3,4}-|s)?d{8} 224.    225.    31、提取信息中的中国电话号码(包括移动和固定电话):((d{3,4})|d{3,4}-|s)?d{7,14} 226.    227.    32、提取信息中的中国邮政编码:[1-9]{1}(d+){5} 228.    229.    33、提取信息中的浮点数(即小数):(-?d*).?d+ 230.    231.    34、提取信息中的任何数字 :(-?d*)(.d+)? 232.    233.    35、IP:(d+).(d+).(d+).(d+) 234.    235.    36、电话区号:/^0d{2,3}$/ 236.    237.    37、腾讯QQ号:^[1-9]*[1-9][0-9]*$ 238.    239.    38、帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 240.    241.    39、中文、英文、数字及下划线:^[u4e00-u9fa5_a-zA-Z0-9]+$


正则表达式是为复杂搜索指定模式的强大方式。

正则表达式描述了一组字符串。最简单的正则表达式是不含任何特殊字符的正则表达式。例如,正则表达式hello匹配hello

非平凡的正则表达式采用了特殊的特定结构,从而使得它们能够与1个以上的字符串匹配。例如,正则表达式hello|word匹配字符串hello或字符串word

作为一个更为复杂的示例,正则表达式B[an]*s匹配下述字符串中的任何一个:BananasBaaaaasBs以及以B开始、以s结束、并在其中包含任意数目an字符的任何其他字符串。

对于REGEXP操作符,正则表达式可以使用任何下述特殊字符和结构:

·         ^

匹配字符串的开始部分。

mysql> SELECT 'fo/nfo' REGEXP '^fo$';                   -> 0
mysql> SELECT 'fofo' REGEXP '^fo';                      -> 1

·         $

匹配字符串的结束部分。

mysql> SELECT 'fo/no' REGEXP '^fo/no$';                 -> 1
mysql> SELECT 'fo/no' REGEXP '^fo$';                    -> 0

·         .

匹配任何字符(包括回车和新行)。

mysql> SELECT 'fofo' REGEXP '^f.*$';                    -> 1
mysql> SELECT 'fo/r/nfo' REGEXP '^f.*$';                -> 1
 SELECT 'f' REGEXP '^f.';                                               ->0
SELECT 'f1' REGEXP '^f.';                                            ->1

·         a*

匹配0或多个a字符的任何序列。

mysql> SELECT 'Ban' REGEXP '^Ba*n';                     -> 1
mysql> SELECT 'Baaan' REGEXP '^Ba*n';                   -> 1
mysql> SELECT 'Bn' REGEXP '^Ba*n';                      -> 1
SELECT 'f' REGEXP '^f*';                                                ->1

·         a+

匹配1个或多个a字符的任何序列。

mysql> SELECT 'Ban' REGEXP '^Ba+n';                     -> 1
mysql> SELECT 'Bn' REGEXP '^Ba+n';                      -> 0
SELECT 'faaCC' REGEXP '^fA+';                                   ->1

·         a?

匹配0个或1a字符。

mysql> SELECT 'Bn' REGEXP '^Ba?n';                      -> 1
mysql> SELECT 'Ban' REGEXP '^Ba?n';                     -> 1
mysql> SELECT 'Baan' REGEXP '^Ba?n';                    -> 0

·         de|abc

匹配序列deabc

mysql> SELECT 'pi' REGEXP 'pi|apa';                     -> 1
mysql> SELECT 'axe' REGEXP 'pi|apa';                    -> 0
mysql> SELECT 'apa' REGEXP 'pi|apa';                    -> 1
mysql> SELECT 'apa' REGEXP '^(pi|apa)$';                -> 1
mysql> SELECT 'pi' REGEXP '^(pi|apa)$';                 -> 1
mysql> SELECT 'pix' REGEXP '^(pi|apa)$';                -> 0

·         (abc)*

匹配序列abc0个或多个实例。

mysql> SELECT 'pi' REGEXP '^(pi)*$';                    -> 1
mysql> SELECT 'pip' REGEXP '^(pi)*$';                   -> 0
mysql> SELECT 'pipi' REGEXP '^(pi)*$';                  -> 1

·         {1},{2,3}

{n}{m,n}符号提供了编写正则表达式的更通用方式,能够匹配模式的很多前述原子(或部分)。mn均为整数。

o        a*

可被写入为a{0,}

o        a+

可被写入为a{1,}

o        a?

可被写入为a{0,1}

更准确地讲,a{n}an个实例准确匹配。a{n,}匹配an个或更多实例。a{m,n}匹配amn个实例,包含mn

mn必须位于0RE_DUP_MAX(默认为255)的范围内,包含0RE_DUP_MAX。如果同时给定了mnm必须小于或等于n

mysql> SELECT 'abcde' REGEXP 'a[bcd]{2}e';              -> 0
mysql> SELECT 'abcde' REGEXP 'a[bcd]{3}e';              -> 1
mysql> SELECT 'abcde' REGEXP 'a[bcd]{1,10}e';           -> 1

·         [a-dX],[^a-dX]

匹配任何是(或不是,如果使用^的话)a、b、c、d或X的字符。两个其他字符之间的“-”字符构成一个范围,与从第1个字符开始到第2个字符之间的所有字符匹配。例如,[0-9]匹配任何十进制数字 。要想包含文字字符“]”,它必须紧跟在开括号“[”之后。要想包含文字字符“-”,它必须首先或最后写入。对于[]对内未定义任何特殊含义的任何字符,仅与其本身匹配。

mysql> SELECT 'aXbc' REGEXP '[a-dXYZ]';                 -> 1
mysql> SELECT 'aXbc' REGEXP '^[a-dXYZ]$';               -> 0
mysql> SELECT 'aXbc' REGEXP '^[a-dXYZ]+$';              -> 1
mysql> SELECT 'aXbc' REGEXP '^[^a-dXYZ]+$';             -> 0
mysql> SELECT 'gheis' REGEXP '^[^a-dXYZ]+$';            -> 1
mysql> SELECT 'gheisa' REGEXP '^[^a-dXYZ]+$';           -> 0

·         [.characters.]

在括号表达式中(使用[]),匹配用于校对元素的字符序列。字符为单个字符或诸如新行等字符名。在文件regexp/cname.h中,可找到字符名称的完整列表。

mysql> SELECT '~' REGEXP '[[.~.]]';                     -> 1
mysql> SELECT '~' REGEXP '[[.tilde.]]';                 -> 1

·         [=character_class=]

在括号表达式中(使用[和]),[=character_class=]表示等同类。它与具有相同校对值的所有字符匹配,包括它本身,例如,如果o和(+)均是等同类的成员,那么[[=o=]]、[[=(+)=]]和[o(+)]是同义词。等同类不得用作范围的端点。

·         [:character_class:]

在括号表达式中(使用[和]),[:character_class:]表示与术语类的所有字符匹配的字符类。标准的类名称是:

alnum

文字数字字符

alpha

文字字符

blank

空白字符

cntrl

控制字符

digit

数字字符

graph

图形字符

lower

小写文字字符

print

图形或空格字符

punct

标点字符

space

空格、制表符、新行、和回车

upper

大写文字字符

xdigit

十六进制数字字符

它们代表在ctype(3)手册页面中定义的字符类。特定地区可能会提供其他类名。字符类不得用作范围的端点。

mysql> SELECT 'justalnums' REGEXP '[[:alnum:]]+';       -> 1
mysql> SELECT '!!' REGEXP '[[:alnum:]]+';               -> 0

·         [[:<:]], [[:>:]]

这些标记表示word边界。它们分别与word的开始和结束匹配。word是一系列字字符,其前面和后面均没有字字符。字字符是alnum类中的字母数字字符或下划线(_)。

mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]';   -> 1
mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]';  -> 0

要想在正则表达式中使用特殊字符的文字实例,应在其前面加上2个反斜杠“/”字符。MySQL解析程序负责解释其中一个,正则表达式库负责解释另一个。例如,要想与包含特殊字符“+”的字符串“1+2”匹配,在下面的正则表达式中,只有最后一个是正确的:

mysql> SELECT '1+2' REGEXP '1+2';                       -> 0
mysql> SELECT '1+2' REGEXP '1/+2';                      -> 0
mysql> SELECT '1+2' REGEXP '1//+2';                     -> 1
 
 
基本形式:
属性名 regexp ‘匹配方式’
属性名表示需要查询的字段的名称;匹配方式表示以哪种方式来进行匹配查询。
正则表达式模式字符:
^: 匹配字符串开始的部分
$: 匹配字符串结束的部分
.: 代表字符串中的任意一个字符,包括回车和换行
[字符集合]: 匹配“字符集合”中的任何一个字符
[^字符集合]: 匹配出了“字符集合”以外的任何一个字符
S1|S2|S3: 匹配S1、S2和S3中的任意一个字符串
*: 代表多个该符号之前的字符,包括0和1个
+: 代表多个该符号之前的字符,包括1个
字符串{N}: 字符串出现N次
字符串{M,N}: 字符串出现至少M次,最多N次
 
 
 电话号码匹配正则表达式:
 
匹配本地固定电话:
^([2-9]{7,8})$
 
长途手机匹配:
^01[3458]([0-9]{9})$
 
匹配本地手机:
^1[3458]([0-9]{9})$
 
匹配国内长途:
^0[1-9]([0-9]{11,12})$
 
匹配内部分机:
^[1-9]{4,5}$
 
匹配400,800电话:
^[48]00([0-9]{7})$
 
 
Perl正则表达式,匹配操作符,替换操作符修饰符,转换操作符,正则表达式是一个字符串的字符定义视图的模式或多模式

正则表达式是一个字符串的字符定义视图的模式或多模式。在Perl的正则表达式的语法是什么,你会发现在其他正则表达式,如sedgrepawk的支持程序非常相似。

运用正则表达式的基本方法是使用结合的经营模式=〜和!〜。第一个是一个测试操作符,第二是一个赋值操作符。


  • 匹配正则表达式 - m//
  • 替代正则表达式 - s///
  • 直译(拼写)正则表达式 - tr///

在每种情况下斜线作为正则表达式(regex的),你指定的分隔符。如果你喜欢用任何其他分隔符,那么你可以代替使用斜线的位置。

匹配操作符

m//匹配操作符,用来匹配一个正则表达式字符串或语句。例如,要匹配的字符序列“foo”对标量$bar,你可能会使用这样的语句:

if ($bar =~ /foo/)

m//其实与同样功能的q//操作符。你可以使用任何自然匹配的字符作为分隔符表达式的组合,例如,{},m(),和m><都是有效的。

如果分隔符是斜杠,你可以从m//省略 成m,但所有其他的分隔符,你必须使用m前缀。

请注意,整个匹配表达式表现出来。即=〜!或〜匹配操作符左边的表达式,返回true(在标量上下文)如果表达式匹配。因此,语句:

$true = ($foo =~ m/foo/);

将会设置$true的值为1 如果$foo匹配正则表达式, 否则$true为0匹配失败。

匹配在列表上下文中,返回任何分组表达式的内容。例如,从字符串中提取的小时,分钟和秒时,我们可以使用:

my ($hours, $minutes, $seconds) = ($time =~ m/(d+):(d+):(d+)/);

匹配运算符修饰符

匹配的操作符支持其自己的一套修饰符。 /g的修饰符,使全局匹配,/i修饰符将匹配不区分大小写。这里是完整的修饰符列表:

Modifier	Description i 	Makes the match case insensitivem 	Specifies that if the string has newline or carriage	return characters, the ^ and $ operators will now	match against a newline boundary, instead of a	string boundaryo 	Evaluates the expression only onces 	Allows use of . to match a newline characterx 	Allows you to use white space in the expression for clarityg 	Globally finds all matchescg 	Allows the search to continue even after a global match fails

只匹配一次

还有一个简单的版本匹配操作符 - ?Pattern?操作符。这基本上是等同于m//运算符但它仅匹配一次在字符串之间的每个调用reset。

例如,可以使用此列表内的第一个和最后一个元素:

#!/usr/bin/perl@list = qw/food foosball subeo footnote terfoot canic footbrdige/;foreach (@list){   $first = $1 if ?(foo.*)?;   $last = $1 if /(foo.*)/;}print "First: $first, Last: $last
";# by www.51coolma.cnThis will produce following resultFirst: food, Last: footbrdige

替换操作符

替换操作符,s///确实是只是一个扩展,使您可以更换一些新的文本匹配的文本匹配运算符。此运算符基本形式是:

s/PATTERN/REPLACEMENT/;

PATTERN 是我们正在寻找的正则表达式的文本。REPLACEMENT 是一个规范,我们要用来替换找到的文字与文本或正则表达式。

例如,我们可以使用.cat. 替换所有出现的.dog。

$string =~ s/dog/cat/;

另外一个例子:

#/user/bin/perl$string = 'The cat sat on the mat';$string =~ s/cat/dog/;print "Final Result is $string
";This will produce following resultThe dog sat on the mat

替换操作符修饰符

这里是替代操作符的所有修改的列表:

Modifier	Description i 	Makes the match case insensitivem 	Specifies that if the string has newline or carriage	return characters, the ^ and $ operators will now	match against a newline boundary, instead of a	string boundaryo 	Evaluates the expression only onces 	Allows use of . to match a newline characterx 	Allows you to use white space in the expression	for clarityg 	Replaces all occurrences of the found expression	with the replacement texte 	Evaluates the replacement as if it were a Perl statement,	and uses its return value as the replacement text

转换

转换相似但不完全相同替换的原则,但不像替换转换(翻译)不使用正则表达式搜索替换值。转换操作符是:

tr/SEARCHLIST/REPLACEMENTLIST/cdsy/SEARCHLIST/REPLACEMENTLIST/cds

翻译替换在SEARCHLIST与在REPLACEMENTLIST相应出现的字符所有字符。例如,使用“The cat sat on the mat.”字符串我们已经在本章中使用:

#/user/bin/perl$string = 'The cat sat on the mat';$string =~ tr/a/o/;print "$string
";This will produce following resultThe cot sot on the mot.


也可用于标准的Perl范围,允许你指定字符的范围,由字母或数值。要改变字符串的情况下,您可以使用以下语法在位置的uc函数。


$string =~ tr/a-z/A-Z/;

转换操作符

以下是有关操作符的运算符名单

Modifier 	Descriptionc 	Complement SEARCHLIST.d 	Delete found but unreplaced characters.s 	Squash duplicate replaced characters.

/ D的修饰符删除匹配SEARCHLIST的字符,不具备相应的条目在REPLACEMENTLIST。例如:

#!/usr/bin/perl $string = 'the cat sat on the mat.';$string =~ tr/a-z/b/d;print "$string
";This will produce following resultb b   b.

最后的修饰符,/s删除被替换的字符的重复序列,因此:

#!/usr/bin/perl$string = 'food';$string = 'food';$string =~ tr/a-z/a-z/s;print $string;This will produce following resultfod

更复杂的正则表达式

你不只是有固定的字符串匹配。事实上,你可以在任何可以使用更复杂的正则表达式只是匹配。这里有一个快速的小抄:

Character		Description .              a single characters             a whitespace character (space, tab, newline)S             non-whitespace character # by www.51coolma.cnd             a digit (0-9)D             a non-digitw             a word character (a-z, A-Z, 0-9, _)W             a non-word character[aeiou]        matches a single character in the given set[^aeiou]       matches a single character outside the given set(foo|bar|baz)  matches any of the alternatives specified

量词可以用来指定有多少以前的东西,你要匹配,其中“thing”是指一个原义字符,上面列出的元字符,或一组括号中的字符或元字符。

Character            Description *              zero or more of the previous thing+              one or more of the previous thing?              zero or one of the previous thing{3}            matches exactly 3 of the previous thing{3,6}          matches between 3 and 6 of the previous thing{3,}           matches 3 or more of the previous thing

^元字符匹配字符串的开头和 $ metasymbol 匹配字符串的结尾。
这里有一些简单的例子

# nothing in the string (start and end are adjacent)/^$/   # a three digits, each followed by a whitespace# character (eg "3 4 5 ")/(ds){3}/  # matches a string in which every# odd-numbered letter is a (eg "abacadaf")/(a.)+/  # string starts with one or more digits/^d+/# string that ends with one or more digits/d+$/

让我们看看另一个例子

#!/usr/bin/perl$string = "Cats go Catatonic
When given Catnip";($start) = ($string =~ /A(.*?) /);@lines = $string =~ /^(.*?) /gm;print "First word: $start
","Line starts: @lines
";This will produce following resultFirst word: CatsLine starts: Cats When

匹配边界

匹配任何单词边界,w类和W类之间的区别定义。 因为w一个字的字符,W相反,这通常是指一个词的终止。 B断言不是一个单词边界匹配任何位置。例如:

/cat/ # Matches 'the cat sat' but not 'cat on the mat'/BcatB/ # Matches 'verification' but not 'the cat on the mat'/catB/ # Matches 'catatonic' but not 'polecat'/Bcat/ # Matches 'polecat' but not 'catatonic'

选择替代品

|字符是一样的标准或按位或在Perl。它指定一个正则表达式或组内的备用匹配。例如,以匹配表达式中的“cat”或“dog”,你可能会使用这个:

if ($string =~ /cat|dog/)

您可以将单个表达式的元素结合在一起,以支持复杂的匹配。寻找两个人的名字,可以实现两个独立的测试,像这样:

if (($string =~ /Martin Brown/) ||   ($string =~ /Sharon Brown/))This could be written as followsif ($string =~ /(Martin|Sharon) Brown/)

分组匹配

从一个角度的正则表达式看没有区别,也许前者是稍微更清晰。

$string =~ /(S+)s+(S+)/;and $string =~ /S+s+S+/;

然而,在分组的好处是,它使我们能够从一个正则表达式提取序列。返回一个列表的顺序,在他们出现在原来的分组。例如,在下面的片段中,我们已经从一个字符串取出小时,分钟和秒。

my ($hours, $minutes, $seconds) = ($time =~ m/(d+):(d+):(d+)/);

除了这种直接的方法,也可以在特殊的$x变量,其中x是该组内一些正则表达式匹配组。因此,我们可以重写前面的例子如下:

$time =~ m/(d+):(d+):(d+)/;my ($hours, $minutes, $seconds) = ($1, $2, $3);

当组用于替代表达式,$ x的语法,可以用来替换文本。因此,我们可以使用此格式化的日期字符串:

#!/usr/bin/perl$date = '03/26/1999';$date =~ s#(d+)/(d+)/(d+)#$3/$1/$2#;print "$date";This will produce following result1999/03/26

使用G断言

G断言,让您可以继续搜索从最后一个匹配发生的点。

例如,在下面的代码,我们使用的G,使我们可以搜索到正确的位置,然后提取一些信息,而无需创建一个更复杂的,单一的正则表达式:

#!/usr/bin/perl$string = "The time is: 12:31:02 on 4/12/00";$string =~ /:s+/g;($time) = ($string =~ /G(d+:d+:d+)/);$string =~ /.+s+/g;($date) = ($string =~ m{G(d+/d+/d+)});print "Time: $time, Date: $date
";This will produce following resultTime: 12:31:02, Date: 4/12/00

G断言,其实只是元符号相当于pos函数,所以正则表达式之间的调用,您可以继续使用pos,甚至修改pos的值(因此 G)的使用pos作为一个lvalue子程序:

正则表达式中的变量

正则表达式的变量,包括$,包含匹配无论最后的分组匹配; $&, 其中包含整个匹配的字符串; $`, 其中包含匹配字符串前的一切;  和$', 其中包含匹配的字符串后的一切。

下面的代码演示的结果:

#!/usr/bin/perl$string = "The food is in the salad bar";$string =~ m/foo/;print "Before: $`
";print "Matched: $&
";print "After: $'
";# www.51coolma.cnThis code prints the following when executed:Before: TheMatched: fooAfter: d is in the salad bar


?  任意单个字符*  任意多个字符<  单词边界>  单词边界[]  多个字符中的一个[-]  一定范围内的任一字符[^x-z]  非{n}  N个重复{n,}  N个或N个以上(greedy!){n,m}  N个到M个@  一个或一个以上(同{1,},从效果来看是non-greedy)

搜索框支持反向引用:(abc)1 => abcabc

替换框支持引用匹配pattern的个数最大为9,从1开始:(1)(2)(3)(4)(5)(6)(7)(8)(9) => 123456789

不支持让我觉得有点郁闷,不过可以将整个串都用括号括起来……但……请见下文

不支持的模式:

Nested tagged expressions: ((a)(b)); (不支持嵌套标签)Non-capture groups;  (不支持非捕获组,像(?:pattern)这些)Alternation: a | the;  (不支持“或”)

以上内容,请选中“查找和替换”对话框中的“使用通配符”进行测试,在非通配符模式下(即不使用“正则”时,不选中“使用通配符”),个人觉得有一个点很值得重视,也许其他正则引擎可以学习一下的:

替换框可以用^c来引用 剪贴板内容!!

字符含意

做为转意,即通常在""后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后//,转意为匹配一个单词的边界。 
-或- 
对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,aa,aaa,加了""后,/a*/将只匹配"a*"。

^匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a"
$匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A"
*匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa
+匹配前面元字符1次或多次,/ba*/将匹配ba,baa,baaa
?匹配前面元字符0次或1次,/ba*/将匹配b,ba
(x)匹配x保存x在名为$1...$9的变量中
x|y匹配x或y
{n}精确匹配n次
{n,}匹配n次以上
{n,m}匹配n-m次
[xyz]字符集(character set),匹配这个集合中的任一一个字符(或元字符)
[^xyz]不匹配这个集合中的任何一个字符
[]匹配一个退格符
匹配一个单词的边界
B匹配一个单词的非边界
cX这儿,X是一个控制符,/cM/匹配Ctrl-M
d匹配一个字数字符,/d/ = /[0-9]/
D匹配一个非字数字符,/D/ = /[^0-9]/
匹配一个换行符
匹配一个回车符
s匹配一个空白字符,包括 , ,f, ,v等
S匹配一个非空白字符,等于/[^ f v]/
匹配一个制表符
v匹配一个重直制表符
w匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[w]匹配"$5.98"中的5,等于[a-zA-Z0-9]
W匹配一个不可以组成单词的字符,如[W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。

用re = new RegExp("pattern",["flags"]) 的方式比较好 
pattern : 正则表达式 
flags: g (全文查找出现的所有 pattern) 
i (忽略大小写) 
m (多行查找)

vaScript动态正则表达式问题

请问正则表达式可以动态生成吗? 
例如JavaScript中: 
var str = "strTemp"; 
要生成: 
var re = /strTemp/; 
如果是字符连接: 
var re = "/" + str + "/"即可 
但是要生成表达式,可以实现吗?怎样实现?

 
   
   


数字:^[0-9]*$n位的数字:^d{n}$至少n位的数字:^d{n,}$m-n位的数字:^d{m,n}$零和非零开头的数字:^(0|[1-9][0-9]*)$非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$带1-2位小数的正数或负数:^(-)?d+(.d{1,2})?$正数、负数、和小数:^(-|+)?d+(.d+)?$有两位小数的正实数:^[0-9]+(.[0-9]{2})?$有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$非零的正整数:^[1-9]d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^+?[1-9][0-9]*$非零的负整数:^-[1-9][]0-9"*$ 或 ^-[1-9]d*$非负整数:^d+$ 或 ^[1-9]d*|0$非正整数:^-[1-9]d*|0$ 或 ^((-d+)|(0+))$非负浮点数:^d+(.d+)?$ 或 ^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$非正浮点数:^((-d+(.d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$正浮点数:^[1-9]d*.d*|0.d*[1-9]d*$ 或 ^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$负浮点数:^-([1-9]d*.d*|0.d*[1-9]d*)$ 或 ^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$浮点数:^(-?d+)(.d+)?$ 或 ^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$

正则表达式在线生成工具: https://www.51coolma.cn/tools/index?name=create_reg


本教程为你讲一下关于正则表达式匹配空格方法与代码实例哦,看看这几种匹配空格的有效方法吧。
regex.replace (line , @"s+" , ",");//转换空格为“,”s匹配任意的空白符,包括空格,制表符(tab),换行符,中文全角空格s 空白字符:[ ] //这个是重点!制表符 ('u0009') 新行(换行)符 ('u000a') 回车符 ('u000d') 换页符 ('u000c')  报警 (bell) 符 ('u0007') e 转义符 ('u001b') cx 对应于 x 的控制符


实例一
explode是用字符串打散字符串
split才是用正则打散字符串

$str = "123 456";$patten = "/s+/";$result = split($patten,$str);echo join("<br>",$result);

正则表达式在线生成工具: https://www.51coolma.cn/tools/index?name=create_reg



正则表达式非常有用,查找、匹配、处理字符串、替换和转换字符串,输入输出等。而且各种语言都支持,例如.NET正则库,JDK正则包, Perl, JavaScript等各种脚本语言都支持正则表达式。下面整理一些常用的正则表达式。

字符

描述

将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。' ' 匹配一个换行符。序列 '' 匹配 "" 而 "(" 则匹配 "("。
^匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ' ' 或 ' ' 之后的位置。
$匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ' ' 或 ' ' 之前的位置。
*匹配前面的子表达式零次或多次。例如,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}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
?当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
.匹配除 " " 之外的任何单个字符。要匹配包括 ' ' 在内的任何字符,请使用象 '[. ]' 的模式。
(pattern)匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0$9 属性。要匹配圆括号字符,请使用 '(' 或 ')'。
(?:pattern)匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
(?=pattern)正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern)负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "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' 范围内的任意字符。
 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
B匹配非单词边界。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
cx匹配由 指明的控制字符。例如, cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
d匹配一个数字字符。等价于 [0-9]。
D匹配一个非数字字符。等价于 [^0-9]。
f匹配一个换页符。等价于 x0c 和 cL。
匹配一个换行符。等价于 x0a 和 cJ。
匹配一个回车符。等价于 x0d 和 cM。
s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ f v]。
S

匹配任何非空白字符。等价于 [^ f v]。

匹配一个制表符。等价于 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 为一个后跟文字 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 nm 将匹配八进制转义值 nm
nml如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
/i使正则表达式对大小写不敏感, (?-i)是关闭大小写不敏感
(?i)te(?-i)st应该匹配TEst,但是不能匹配teST或TEST.
/s开启“单行模式”,即点号“.”匹配新行符
/m开启“多行模式”,即“^”和“$”匹配新行符的前面和后面的位置。
^[0-9]*$只能输入数字
^d{n}$只能输入n位的数字
^d{n,}$只能输入至少n位的数字
^d{m,n}$只能输入m~n位的数字
^(0|[1-9][0-9]*)$只能输入零和非零开头的数字
^[0-9]+(.[0-9]{2})?$只能输入有两位小数的正实数
^[0-9]+(.[0-9]{1,3})?$只能输入有1~3位小数的正实数
^+?[1-9][0-9]*$只能输入非零的正整数
^-[1-9][]0-9"*$只能输入非零的负整数
^.{3}$只能输入长度为3的字符
^[A-Za-z]+$只能输入由26个英文字母组成的字符串
^[A-Za-z0-9]+$只能输入由数字和26个英文字母组成的字符串
^w+$只能输入由数字、26个英文字母或者下划线组成的字符串
^[a-zA-Z]w{5,17}$验证用户密码:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
[^%&',;=?$x22]+验证是否含有^%&',;=?$"等字符
^[u4e00-u9fa5]{0,}$只能输入汉字
^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$验证Email地址
^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$验证InternetURL
^d{15}|d{18}$验证身份证号(15位或18位数字)
^((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)$验证IP地址
(w)1匹配两个两个重叠出现的字符

例如,"aabbc11asd", 返回结果为aa bb 11三组match

<(?[^s>]+)[^>]*>.*>匹配成对的HTML标签
(?!)不出现,负声明
下例演示如何取得一个标签对中的全部内容,即使其中包含别的HTML tag。 

string newsContent = @"url:test Regex."; Regex regEnd = new Regex(@"<s*a[^>]*>([^<]|<(?!/a))*<s*/as*>",RegexOptions.Multiline); 

 

1. 匹配组

常用的组匹配:(实用)

(exp)

匹配exp并且捕获到一个自动命名的组

(?<name>exp)

匹配exp并且捕获到组’name’
(?=exp)exp出现在声明右侧,但exp不作为匹配括号中的模式必须出现在声明右侧,但不作为匹配的一部分 ,例如:输入: public keywod string "abc"; 正则:w+(?=ing),返回“str”,意思为:匹配以ing结束的单词,但ing不作为返回
(?<=exp)exp出现在声明左侧,但exp不作为匹配括号中的模式必须出现在声明左侧,但不作为匹配的一部分 ,例如:输入: public remember string "abc"; 正则:(?<=re)w+,返回“member”,意思为:匹配以re开头的单词,但re不作为返回

(?!exp)

 

exp不出现在声明右侧,但exp不作为匹配括号中的模式必须不出现在声明右侧 ,例如:输入: remember aqa bqu "abc"; 正则:w*q(?!u)w*,返回“aqa”,意思为:匹配带q后面不是跟随u的单词

(?exp)

exp不出现在声明左侧,但exp不作为匹配

 

输入public string keywod = "abc"; string value = "test";

目的:匹配 关键字="",例如获得关键字keyword,value;获得等于的值abc和test

表达式string (?[^=]*?) *= *(?[^;]*?);

代码

private void ParseKeywords(string input){ System.Text.RegularExpressions.MatchCollection mc =  System.Text.RegularExpressions.Regex.Matches(input, @"string (?[^=]*?) *= *(?[^;]*?);");  if (mc != null && mc.Count > 0) { foreach (System.Text.RegularExpressions.Match m in mc) { string keyword = m.Groups["x"].Value; string value = m.Groups["y"].Value; } }}


截图

1 

2. 匹配并替换

输入public <%=classname%>Extension : IExt

目的:匹配 <%= %>中间的classname并替换

表达式:<%=.*%>

代码

private string Replace(string input){ return Regex.Replace(input, @"<%=.*%>", new MatchEvaluator(RefineCodeTag), RegexOptions.Singleline);} string RefineCodeTag(Match m){ string x = m.ToString();  x = Regex.Replace(x, "<%=", ""); x = Regex.Replace(x, "%>", "");  return x.Trim() + ",";}

截图:

2 

正则表达式选项RegexOptions:

ExplicitCapture

n

只有定义了命名或编号的组才捕获

IgnoreCasei不区分大小写
IgnorePatternWhitespacex消除模式中的非转义空白并启用由 # 标记的注释。
MultiLinem

多行模式,其原理是修改了^和$的含义

SingleLines

单行模式,和MultiLine相对应

正则表达式替换的其他功能:

$number把匹配的第number组替换成替换表达式

这段代码返回的是 “01 012 03 05”

就是说,对组一的每个匹配结果都用"0$1"这个表达式来替换,"0$1"中"$1"由组1匹配的结果代入


public static void Main(){  string s = "1 12 3 5"; s = Regex.Replace(s,@"(d+)(?#这个是注释)","0$1",RegexOptions.Compiled|RegexOptions.IgnoreCase); Console.WriteLine(s); Console.ReadLine(); }

${name}

把匹配的组名为"name"的组替换成表达式,

上例的Regex expression改成@"(?d+)(?#这个是注释)"后面的替换式改为"0${name}"结果是一样的

$$

做$的转义符,如上例表达式改成@"(?d+)(?#这个是注释)"和"$$${name}",则结果为"$1 $12 $3 $5"

$&替换整个匹配
$`替换匹配前的字符
$'替换匹配后的字符
$+替换最后匹配的组
$_替换整个字符串

 

3. 匹配URL中文件名

输入http://www.51coolma.cn

目的:从URL地址中提取文件名

表达式s=s.replace(/(.*/){0,}([^.]+).*/ig,"$2") ;

代码

string s = "http://www.51coolma.cn";
s = s.replace(/(.*/){0,}([^.]+).*/ig, "$2") ;
 


注:元字符包括 | ( ) [ ] { } ^ $ * + ? . )

  • 匹配中文字符的正则表达式: [u4e00-u9fa5]
    评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
  • 匹配双字节字符(包括汉字在内):[^x00-xff]
    评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
  • 匹配空白行的正则表达式: s*
    评注:可以用来删除空白行
  • 匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?</>|<.*? />
    评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
  • 匹配首尾空白字符的正则表达式:^s*|s*$
    评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
  • 匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
    评注:表单验证时很实用
  • 匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
    评注:网上流传的版本功能很有限,上面这个基本可以满足需求
  • 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]$
    评注:表单验证时很实用
  • 匹配国内电话号码:d-d|d-d
    评注:匹配形式如 0511-4405222 或 021-87888822
  • 匹配腾讯QQ号:[1-9][0-9]
    评注:腾讯QQ号从10000开始
  • 匹配中国邮政编码:[1-9]d(?!d)
    评注:中国邮政编码为6位数字
  • 匹配身份证:d|d
    评注:中国的身份证为15位或18位
  • 匹配ip地址:d+.d+.d+.d+
    评注:提取ip地址时有用
  • 匹配特定数字:
    ^[1-9]d*$    //匹配正整数
    ^-[1-9]d*$   //匹配负整数
    ^-?[1-9]d*$   //匹配整数
    ^[1-9]d*|0$  //匹配非负整数(正整数 + 0)
    ^-[1-9]d*|0$   //匹配非正整数(负整数 + 0)
    ^[1-9]d*.d*|0.d*[1-9]d*$   //匹配正浮点数
    ^-([1-9]d*.d*|0.d*[1-9]d*)$  //匹配负浮点数
    ^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$  //匹配浮点数
    ^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$   //匹配非负浮点数(正浮点数 + 0)
    ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$  //匹配非正浮点数(负浮点数 + 0)
    评注:处理大量数据时有用,具体应用时注意修正
  • 匹配特定字符串:
    ^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
    ^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
    ^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
    ^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
    ^w+$  //匹配由数字、26个英文字母或者下划线组成的字符串
    评注:最基本也是最常用的一些表达式

今天在Java中想使用正则表达式来获取一段文本中的任意字符。于是很随意得就写出如下匹配规则:

(.*)

结果运行之后才发现,无法获得换行之后的文本。于是查了一下手册,才发现正则表达式中,“.”(点符号)匹配的是除了换行符“ ”以外的所有字符。同时, 手册上还有一句话:要匹配包括 ‘ ’ 在内的任何字符,请使用像 ‘[. ]’ 的模式。于是我将正则表达式的匹配规则修改如下:

([.
]*)

当然,如果是在java程序中直接写到话,需要改为([. ]*)

结果再次运行程序,发现什么内容也取不到了。我百思不得其解,又将其修改为如下规则:

([.|
]*) 以及 ([
.]*)

结果还是不行,什么内容都取不到。看来点符号和换行符卯上劲了~
然后上网一查,虽然没有查出上述规则到底是什么地方出问题了,但是查出了一个解决办法,经过一试,果然可以匹配包括换行符在内的任意字符,以下为正确的正则表达式匹配规则:

([sS]*)

同时,也可以用 “([dD]*)”、“([wW]*)” 来表示。

正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。

举例来说,正则表达式的一个最为普遍的应用就是用于验证用户在线输入的邮件地址的格式是否正确。如果通过正则表达式验证用户邮件地址的格式正确,用户所填写的表单信息将会被正常处理;反之,如果用户输入的邮件地址与正则表达的模式不匹配,将会弹出提示信息,要求用户重新输入正确的邮件地址。由此可见正则表达式在WEB应用的逻辑判断中具有举足轻重的作用。

基本语法在对正则表达式的功能和作用有了初步的了解之后,我们就来具体看一下正则表达式的语法格式。正则表达式的形式一般如下:

/love/

其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

较为常用的元字符包括:   “+”,   “*”,以及   “?”。其中,“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次,“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次,而“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。
下面,就让我们来看一下正则表达式元字符的具体应用。

/fo+/

因为上述正则表达式中包含“+”元字符,表示可以与目标对象中的   “fool”,   “fo”,   或者   “football”等在字母f后面连续出现一个或多个字母o的字符串相匹配。

/eg*/

因为上述正则表达式中包含“*”元字符,表示可以与目标对象中的   “easy”,   “ego”,   或者   “egg”等在字母e后面连续出现零个或多个字母g的字符串相匹配。

/Wil?/

因为上述正则表达式中包含“?”元字符,表示可以与目标对象中的   “Win”,   或者   “Wilson”,等在字母i后面连续出现零个或一个字母l的字符串相匹配。

除了元字符之外,用户还可以精确指定模式在匹配对象中出现的频率。例如,

/jim{2,6}/

上述正则表达式规定字符m可以在匹配对象中连续出现2-6次,因此,上述正则表达式可以同jimmy或jimmmmmy等字符串相匹配。
在对如何使用正则表达式有了初步了解之后,我们来看一下

其它几个重要的元字符的使用方式。
s:用于匹配单个空格符,包括tab键和换行符;
S:用于匹配除单个空格符之外的所有字符;
d:用于匹配从0到9的数字;
w:用于匹配字母,数字或下划线字符;
W:用于匹配所有与w不匹配的字符;
.   :用于匹配除换行符之外的所有字符。
(说明:我们可以把s和S以及w和W看作互为逆运算)

下面,我们就通过实例看一下如何在正则表达式中使用上述元字符。
/s+/     上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。
/d000/     如果我们手中有一份复杂的财务报表,那么我们可以通过上述正则表达式轻而易举的查找到所有总额达千元的款项。
除了我们以上所介绍的元字符之外,正则表达式中还具有另外一种较为独特的专用字符,即定位符。定位符用于规定匹配模式在目标对象中的出现位置。

较为常用的定位符包括:   “^”,   “$”,   “”   以及   “B”。

其中,“^”定位符规定匹配模式必须出现在目标字符串的开头,“$”定位符规定匹配模式必须出现在目标对象的结尾,定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一,而“B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。同样,我们也可以把“^”和“$”以及“”和“B”看作是互为逆运算的两组定位符。举例来说:

/^hell/     因为上述正则表达式中包含“^”定位符,所以可以与目标对象中以   “hell”,   “hello”或   “hellhound”开头的字符串相匹配。
/ar$/     因为上述正则表达式中包含“$”定位符,所以可以与目标对象中以   “car”,   “bar”或   “ar”   结尾的字符串相匹配。
/bom/     因为上述正则表达式模式以“”定位符开头,所以可以与目标对象中以   “bomb”,   或   “bom”开头的字符串相匹配。
/man/     因为上述正则表达式模式以“”定位符结尾,所以可以与目标对象中以   “human”,   “woman”或   “man”结尾的字符串相匹配。

为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。

例如:

/[A-Z]/     上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。
/[a-z]/     上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。
/[0-9]/     上述正则表达式将会与从0到9范围内任何一个数字相匹配。
/([a-z][A-Z][0-9])+/     上述正则表达式将会与任何由字母和数字组成的字符串,如   “aB0”   等相匹配。

这里需要提醒用户注意的一点就是可以在正则表达式中使用   “()”   把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如   “abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。

如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符   “|”。例如:

/to|too|2/     上述正则表达式将会与目标对象中的   “to”,   “too”,   或   “2”   相匹配。

正则表达式中还有一个较为常用的运算符,即否定符   “[^]”。与我们前文所介绍的定位符   “^”   不同,否定符   “[^]”规定目标对象中不能存在模式中所规定的字符串。例如:

/[^A-C]/     上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。一般来说,当“^”出现在   “[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。     最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义符“”。例如:

/Th*/     上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。使用实例     在对正则表达式有了较为全面的了解之后,我们就来看一下如何在Perl,PHP,以及javascript中使用正则表达式。

通常,Perl中正则表达式的使用格式如下:

operator   /   regular-expression   /   string-to-replace   /   modifiers

运算符一项可以是m或s,分别代表匹配运算和替换运算。其中,正则表达式一项是将要进行匹配或替换操作的模式,可以由任意字符,元字符,或定位符等组成。替换字符串一项是使用s运算符时,对查找到的模式匹配对象进行替换的字符串。

最后的参数项用来控制不同的匹配或替换方式。例如:

s/geed/good/

将会在目标对象中查找第一个出现的geed字串,并将其替换为good。如果我们希望在目标对象的全局范围内执行多次查找—   替换操作的话,可以使用参数   “g”,即s/love/lust/g。

此外,如果我们不需要限制匹配的大小写形式的话,可以使 用参数   “i   ”。例如,m/JewEL/i     上述正则表达式将会与目标对象中的jewel,Jewel,或JEWE L相匹配。

在Perl中,使用专门的运算符“=~”指定正则表达式的匹配  对象。例如:     $flag   =~   s/abc/ABC/上述正则表达式将会把变量$flag中的字串abc替换为ABC

本文主要是对匹配中文汉字的正则表达式的介绍,本文同时讲解了匹配中文字符的正则和匹配双字节字符的正则,需要的朋友可以参考下

w 匹配的仅仅是中文,数字,字母,对于国人来讲,仅匹配中文时常会用到,见下

代码如下:
匹配中文字符的正则表达式: [u4e00-u9fa5]



或许你也需要匹配双字节字符,中文也是双字节的字符
代码如下:
匹配双字节字符(包括汉字在内):[^x00-xff]


注:可以用来计算字符串的长度(一个双字节字符长度计 2,ASCII 字符计 1 )



PS:关于正则,本站还提供了一个非常简便实用的正则测试工具供大家使用:

正则表达式在线测试工具://www.51coolma.cn/tools/index?name=reg

在线正则表达式测试

//www.51coolma.cn/tools/index?name=reg




常用正则表达式

  • 匹配中文字符
  • 匹配双字节字符(包括汉字在内)
  • 匹配空白行
  • 匹配Email地址
  • 匹配网址URL
  • 匹配国内电话号码
  • 匹配腾讯QQ号
  • 匹配中国邮政编码
  • 匹配18位身份证号
  • 匹配(年-月-日)格式日期
  • 匹配正整数
  • 匹配负整数
  • 匹配整数
  • 匹配非负整数(正整数 + 0)
  • 匹配非正整数(负整数 + 0)
  • 匹配正浮点数
  • 匹配负浮点数




  • 各式各样的正则表达式参考大全: 

    ^d+$  //匹配非负整数(正整数 + 0)  //匹配整数 ^d+(.d+)?$  //匹配非负浮点数(正浮点数 + 0) ^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$  //匹配正浮点数 ^((-d+(.d+)?)|(0+(.0+)?))$  //匹配非正浮点数(负浮点数 + 0) ^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$  //匹配负浮点数 ^(-?d+)(.d+)?$  //匹配浮点数 ^[A-Za-z]+$????????? //匹配由26个英文字母组成的字符串 ^[A-Z]+$ ??? //匹配由26个英文字母的大写组成的字符串 ^[a-z]+$  //匹配由26个英文字母的小写组成的字符串 ^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串 ^w+$  //匹配由数字、26个英文字母或者下划线组成的字符串 ^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$    //匹配email地址 ^[a-zA-z]+://匹配(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$  //匹配url 匹配中文字符的正则表达式: [u4e00-u9fa5] 匹配双字节字符(包括汉字在内):[^x00-xff] 匹配空行的正则表达式:
    [s| ]*
     匹配HTML标记的正则表达式:/<(.*)>.*</>|<(.*) />/ 匹配首尾空格的正则表达式:(^s*)|(s*$) 匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 匹配网址URL的正则表达式:^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$ 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 匹配国内电话号码:(d{3}-|d{4}-)?(d{8}|d{7})? 匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$ 



    下表是元字符及其在正则表达式上下文中的行为的一个完整列表,具体到每个正则表达式符号: 
     将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。 ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 ’
    ’ 或 ’
    ’ 之后的位置。 $ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性,$ 也匹配 ’
    ’ 或 ’
    ’ 之前的位置。 * 匹配前面的子表达式零次或多次。 + 匹配前面的子表达式一次或多次。+ 等价于 {1,}。 ? 匹配前面的子表达式零次或一次。? 等价于 {0,1}。 {n} n 是一个非负整数,匹配确定的n 次。 {n,} n 是一个非负整数,至少匹配n 次。 {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。 ? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。 . 匹配除 "
    " 之外的任何单个字符。要匹配包括 ’
    ’ 在内的任何字符,请使用象 ’[.
    ]’ 的模式。 (pattern) 匹配pattern 并获取这一匹配。 (?:pattern) 匹配pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。 (?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。 (?!pattern) 负向预查,与(?=pattern)作用相反 x|y 匹配 x 或 y。 [xyz] 字符集合。 [^xyz] 负值字符集合。 [a-z] 字符范围,匹配指定范围内的任意字符。[^a-z] 负值字符范围,匹配任何不在指定范围内的任意字符。  匹配一个单词边界,也就是指单词和空格间的位置。 B 匹配非单词边界。 cx 匹配由x指明的控制字符。 d 匹配一个数字字符。等价于 [0-9]。 D 匹配一个非数字字符。等价于 [^0-9]。? f 匹配一个换页符。等价于 x0c 和 cL。 
     匹配一个换行符。等价于 x0a 和 cJ。 
     匹配一个回车符。等价于 x0d 和 cM。 s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ f
    
    	v]。 S 匹配任何非空白字符。等价于 [^ f
    
    	v]。 	 匹配一个制表符。等价于 x09 和 cI。v 匹配一个垂直制表符。等价于 x0b 和 cK。 w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。W 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。 
    um 匹配 num,其中num是一个正整数。对所获取的匹配的引用。 
     标识一个八进制转义值或一个后向引用。如果 
     之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。 
    m 标识一个八进制转义值或一个后向引用。如果 
    m 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 
    m 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 
    m 将匹配八进制转义值 nm。 
    ml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八.


    正则表达式 (regex) 的快速参考,包括符号、范围、分组、断言和一些帮助您入门的示例模式。

    开始

    字符类

    [abc]单个字符:a、b 或 c
    [^abc]一个字符,除了:a、b 或 c
    [a-z]范围内的一个字符:az
    [^a-z]不在范围内的字符:az
    [0-9]范围内的数字:0-9
    [a-zA-Z]范围内的一个字符:
    az 或 AZ
    [a-zA-Z0-9]范围内的一个字符:
    az、AZ 或 0-9

    量词

    a?零个或一个
    a*零个或多个
    a+一个或多个
    [0-9]+0-9 中的一项或多项
    a{3}正好 3 个
    a{3,}3个或更多
    a{3,6}介于 3 和 6 之间
    a*贪婪量词
    a*?惰性量词
    a*+所有格量词

    常见元字符

    • ^
    • {
    • +
    • <
    • [
    • *
    • )
    • >
    • .
    • (
    • |
    • $
    • ?

    转义这些特殊字符

    元序列

    .任意单个字符
    s任何空白字符
    S任何非空白字符
    d任意数字,同[0-9]
    D任何非数字,同[^0-9]
    w任何单词字符
    W任何非单词字符
    X任何 Unicode 序列,包括换行符
    C匹配一个数据单元
    RUnicode 换行符
    v垂直空白字符
    Vv 的否定 - 除了换行符和垂直制表符之外的任何东西
    h水平空白字符
    Hh 的否定
    K重置匹配
    匹配第 n 个子模式
    pXUnicode 属性 X
    p{...}Unicode 属性或脚本类别
    PXpX 的否定
    P{...}p 的否定
    Q...E引用; 视为文字
    k<name>匹配子模式 name
    k'name'匹配子模式 name
    k{name}匹配子模式 name
    gn匹配第 n 个子模式
    g{n}匹配第 n 个子模式
    g<n>递归第 n 个捕获组
    g'n'递归第 n 个捕获组。
    g{-n}匹配第 n 个相对前一个子模式
    g<+n>递归第 n 个相对即将到来的子模式
    g'+n'匹配第 n 个相对即将到来的子模式
    g'letter'递归命名捕获组 letter
    g{letter}匹配先前命名的捕获组 letter
    g<letter>递归命名捕获组 letter
    xYY十六进制 YY
    x{YYYY}十六进制字符 YYYY
    ddd八进制字符ddd
    cY控制字符 Y
    []退格字符
    使任何字符文字

    G比赛开始
    ^字符串的开始
    $字符串结束
    A字符串的开始
    字符串结束
    z字符串的绝对结尾
    一个词的边界
    B非词边界

    替换

    完整的比赛内容
    1捕获组 1 中的内容
    $1捕获组 1 中的内容
    ${foo}捕获组中的内容 foo
    x20十六进制替换值
    x{06fa}十六进制替换值
    标签
    回车
    新队
    f换页
    U大写转换
    L小写转换
    E终止任何转换

    组构造

    (...)捕获所有封闭的东西
    (a|b)匹配 a 或 b
    (?:...)匹配包含的所有内容
    (?>...)原子组(非捕获)
    (?|...)重复的子模式组号
    (?#...)评论
    (?'name'...)命名捕获组
    (?<name>...)命名捕获组
    (?P<name>...)命名捕获组
    (?imsxXU)内联修饰符
    (?(DEFINE)...)在使用之前预定义模式

    断言

    (?(1)yes|no)条件语句
    (?(R)yes|no)条件语句
    (?(R#)yes|no)递归条件语句
    (?(R&name)yes|no)条件语句
    (?(?=...)yes|no)有条件的前瞻
    (?(?<=...)yes|no)后视条件

    环视

    (?=...)正向预测
    (?!...)负前瞻
    (?<=...)正面回顾
    (?<!...)负面回顾

    Lookaround 允许您在主模式之前 (lookbehind) 或之后 (lookahead) 匹配一个组,而不将其包含在结果中。

    标志/修饰符

    g全球的
    m多线
    i不区分大小写
    x忽略空格
    s单线
    u统一码
    X扩展
    U不贪心
    A
    J重复的组名
    递归
    (?R)递归整个模式
    (?1)递归第一个子模式
    (?+1)递归第一个相对子模式
    (?&name)递归子模式 name
    (?P=name)匹配子模式 name
    (?P>name)递归子模式 name

    POSIX 字符类

    [[:alnum:]][0-9A-Za-z]字母和数字
    [[:alpha:]][A-Za-z]信件
    [[:ascii:]][x00-x7F]ASCII 码 0-127
    [[:blank:]][ ]仅空格或制表符
    [[:cntrl:]][x00-x1Fx7F]控制字符
    [[:digit:]][0-9]十进制数字
    [[:graph:]][[:alnum:][:punct:]]可见字符(不是空格)
    [[:lower:]][a-z]小写字母
    [[:print:]][ -~] == [ [:graph:]]可见字符
    [[:punct:]][!"#$%&’()*+,-./:;<=>?@[]^_`{|}~]可见标点符号
    [[:space:]][ vf ]空白
    [[:upper:]][A-Z]大写字母
    [[:word:]][0-9A-Za-z_]文字字符
    [[:xdigit:]][0-9A-Fa-f]十六进制数字
    [[:<:]][(?=w)]词的开头
    [[:>:]][(?<=w)]词尾

    控制动词

    (*ACCEPT)控制动词
    (*FAIL)控制动词
    (*MARK:NAME)控制动词
    (*COMMIT)控制动词
    (*PRUNE)控制动词
    (*SKIP)控制动词
    (*THEN)控制动词
    (*UTF)图案修饰符
    (*UTF8)图案修饰符
    (*UTF16)图案修饰符
    (*UTF32)图案修饰符
    (*UCP)图案修饰符
    (*CR)换行修饰符
    (*LF)换行修饰符
    (*CRLF)换行修饰符
    (*ANYCRLF)换行修饰符
    (*ANY)换行修饰符
    R换行修饰符
    (*BSR_ANYCRLF)换行修饰符
    (*BSR_UNICODE)换行修饰符
    (*LIMIT_MATCH=x)正则表达式引擎修饰符
    (*LIMIT_RECURSION=d)正则表达式引擎修饰符
    (*NO_AUTO_POSSESS)正则表达式引擎修饰符
    (*NO_START_OPT)正则表达式引擎修饰符

    正则表达式示例

    字符匹配

    ring匹配 ring springboard
    .匹配  a9+ 等等。
    h.o匹配 hooh2oh/o 等等。
    ring?匹配 ring?
    (quiet)匹配 (quiet)
    c:windows匹配   c:windows

    使用搜索这些特殊字符:
    [ ^ $ . | ? * + ( ) { }

    可替代方案

    cat|dog匹配 cat 或者 dog
    id|identity匹配 id  或者 identity
    identity|id匹配 id  或者 identity

    当备选方案重叠时,从长到短排序

    字符块匹配

    [aeiou]匹配任何元音
    [^aeiou]匹配一个非元音
    r[iau]ng匹配 ring, wrangle, sprung, 等等。
    gr[ae]y匹配 gray  或者 
    [a-zA-Z0-9]匹配任何字母或数字

    [ ]总是逃避. ]有时^ - .

    特殊字符匹配

    w “单词”字符
    (字母、数字或下划线)
    d 数字
    s 空格
    (空格、制表符、vtab、换行符)
    W, D, or S 不是单词、数字或空格
    [DS] 表示不是数字或空格,两者都匹配
    [^ds] 禁止数字和空格

    事件匹配

    colou?r匹配 color 或者 colour
    [BW]ill[ieamy's]*匹配 Bill, Willy, William's  等等。
    [a-zA-Z]+匹配 1 个或多个字母
    d{3}-d{2}-d{4}匹配 SSN
    [a-z]w{1,7}匹配 UW NetID

    贪婪匹配和懒惰匹配

    * + {n,}
    贪婪的
    尽可能匹配
    <.+> 找到 1 个大匹配 <b>粗体</b>
    *? +? {n,}?
    懒惰的
    尽量少搭配
    <.+?>在 < 中找到 2 个匹配项>粗体</b>

    匹配范围

     "单词”边缘(在非“单词”字符旁边)
    ring 单词以“ring”开头,例如 铃声
    ring 单词以“ring”结尾,例如 春天
    9 匹配单个数字 9,而不是 19、91、99 等。
    [a-zA-Z]{6} 匹配 6 个字母的单词
    B 不是字边
    BringB 匹配 springs 和 wringer
    ^d*$ 整个字符串必须是数字
    ^[a-zA-Z]{4,20}$字符串必须有 4-20 个字母
    ^[A-Z] 字符串必须以大写字母开头
    [.!?"')]$ 字符串必须以终结符结尾

    修饰匹配

    (?i)​[a-z]*​(?-i)忽略大小写 ON / OFF
    (?s).*(?-s)匹配多行(导致 . 匹配换行符)
    (?m)^.*;$(?-m)^ & $ 匹配行而不是整个字符串
    (?x)#free-spacing 模式,此 EOL 注释被忽略
    (?-x)自由空间模式关闭
    /regex/ismx整个字符串的修改模式

    组匹配

    (in|out)put 匹配 input 或者 output
    d{5}(-d{4})?美国邮政编码(“+4”可选)

    如果组后匹配失败,解析器会尝试每个替代方案。
    可能导致灾难性的回溯。

    反向引用

    (to) (be) or not 1 2匹配 生存还是毁灭
    ([^s])1{2}匹配非空格,然后再重复两次   aaa, ...
    (w+)s+1匹配双字

    非捕获组

    on(?:click|load)比...快:
    on(click|load)

    尽可能使用非捕获或原子组

    原子组

    (?>red|green|blue)比非捕获更快
    (?>id|identity)匹配 id, 但不是 identity

    “id”匹配,但在原子组之后失败,解析器不会回溯到组以重试“身份”
    如果替代品重叠,则从长到短排序。

    周围匹配

    (?= )向前看,如果你能提前找到
    (?! )向前看,如果你不能提前找到
    (?<= )回头看,如果你能找到后面
    (?<! )回头看,如果你找不到后面
    w+?(?=ing)匹配 warbling, string, fishing,...
    (?!w+ing)w+不以“ing”结尾的单词
    (?<=pre).*? 匹配 pretend,present,prefix,...
    w{3}(?<!pre)w*?不以“pre”开头的单词
    w+(?<!ing)匹配不以“ing”结尾的单词

    If-then-else

    匹配 "Mr." 或者 "Ms."  如果单词“her”在字符串后面

    M(?(?=.*?her)s|r).

    需要环视 ​if​ 条件

    Python 中的正则表达式

    入门

    导入正则表达式模块

    import re

    例子

    re.search()

    >>> sentence = 'This is a sample string'>>> bool(re.search(r'this', sentence, flags=re.I))True>>> bool(re.search(r'xyz', sentence))False

    re.findall()

    >>> re.findall(r's?pare?', 'par spar apparent spare part pare')['par', 'spar', 'spare', 'pare']>>> re.findall(r'0*[1-9]d{2,}', '0501 035 154 12 26 98234')['0501', '154', '98234']

    re.finditer()

    >>> m_iter = re.finditer(r'[0-9]+', '45 349 651 593 4 204')>>> [m[0] for m in m_iter if int(m[0]) < 350]['45', '349', '4', '204']

    re.split()

    >>> re.split(r'd+', 'Sample123string42with777numbers')['Sample', 'string', 'with', 'numbers']

    re.sub()

    >>> ip_lines = "catapults
    concatenate
    cat">>> print(re.sub(r'^', r'* ', ip_lines, flags=re.M))* catapults* concatenate* cat

    重新编译()

    >>> pet = re.compile(r'dog')>>> type(pet)<class '_sre.SRE_Pattern'>>>> bool(pet.search('They bought a dog'))True>>> bool(pet.search('A cat crossed their path'))False

    方法

    re.findall返回包含所有匹配项的列表
    re.finditer返回一个可迭代的匹配对象(每个匹配一个)
    re.search如果字符串中的任何位置都匹配,则返回一个 Match 对象
    re.split返回一个列表,其中字符串在每次匹配时被拆分
    re.sub用字符串替换一个或多个匹配项
    re.compile编译正则表达式模式以备后用
    re.escape返回所有非字母数字反斜杠的字符串

    Flags

    re.Ire.IGNORECASE忽略大小写
    re.Mre.MULTILINE多线
    re.Lre.LOCALE使w, ,s 语言环境相关
    re.Sre.DOTALL点匹配所有

    一、正则表达式基本语法


    两个特殊的符号'^''$'。他们的作用是分别指出一个字符串的开始和结束。例子如下:

    "^The":表示所有以"The"开始的字符串("There","The cat"等);"of despair$":表示所以以"of despair"结尾的字符串;"^abc$":表示开始和结尾都是"abc"的字符串——呵呵,只有"abc"自己了;"notice":表示任何包含"notice"的字符串。

    象最后那个例子,如果你不使用两个特殊字符,你就在表示要查找的串在被查找串的任意部分——你并不把它定位在某一个顶端。

    其它还有'*''+''?'这三个符号,表示一个或一序列字符重复出现的次数。它们分别表示没有或更多一次或更多还有没有或一次。下面是几个例子:

    "ab*":表示一个字符串有一个a后面跟着零个或若干个b。("a", "ab", "abbb",……);"ab+":表示一个字符串有一个a后面跟着至少一个b或者更多;"ab?":表示一个字符串有一个a后面跟着零个或者一个b;"a?b+$":表示在字符串的末尾有零个或一个a跟着一个或几个b。

    你也可以使用范围,用大括号括起,用以表示重复次数的范围。

    "ab{2}":表示一个字符串有一个a跟着2个b("abb");"ab{2,}":表示一个字符串有一个a跟着至少2个b;"ab{3,5}":表示一个字符串有一个a跟着3到5个b。

    请注意,你必须指定范围的下限(如:"{0,2}"而不是"{,2}")。还有,你可能注意到了,'*''+'
    '?'相当于"{0,}""{1,}""{0,1}"
    还有一个'¦',表示操作:

    "hi¦hello":表示一个字符串里有"hi"或者"hello";"(b¦cd)ef":表示"bef"或"cdef";"(a¦b)*c":表示一串"a""b"混合的字符串后面跟一个"c";

    '.'可以替代任何字符:

    "a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字;"^.{3}$":表示有任意三个字符的字符串(长度为3个字符);方括号表示某些字符允许在一个字符串中的某一特定位置出现:"[ab]":表示一个字符串有一个"a"或"b"(相当于"a¦b");"[a-d]":表示一个字符串包含小写的'a'到'd'中的一个(相当于"a¦b¦c¦d"或者"[abcd]");"^[a-zA-Z]":表示一个以字母开头的字符串;"[0-9]%":表示一个百分号前有一位的数字;",[a-zA-Z0-9]$":表示一个字符串以一个逗号后面跟着一个字母或数字结束。


    你也可以在方括号里用'^'表示不希望出现的字符,'^'应在方括号里的第一位。(如:"%[^a-zA-Z]%"
    示两个百分号中不应该出现字母)。

    为了逐字表达,你必须在"^.$()¦*+?{"这些字符前加上转移字符''

    请注意在方括号中,不需要转义字符。

    二、正则表达式验证控制文本框的输入字符类型

    1.只能输入数字和英文的: 

    <input onkeyup="value=value.replace(/[W]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))" ID="Text1" NAME="Text1">

    2.只能输入数字的: 

    <input onkeyup="value=value.replace(/[^d]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))" ID="Text2" NAME="Text2">

    3.只能输入全角的: 

    <input onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))" ID="Text3" NAME="Text3">

    4.只能输入汉字的: 

    <input onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))" ID="Text4" NAME="Text4">

    三、正则表达式的应用实例通俗说明

    *******************************************************************************

    //校验是否全由数字组成/^[0-9]{1,20}$/ ^ 表示打头的字符要匹配紧跟^后面的规则$ 表示打头的字符要匹配紧靠$前面的规则[ ] 中的内容是可选字符集[0-9] 表示要求字符范围在0-9之间{1,20}表示数字字符串长度合法为1到20,即为[0-9]中的字符出现次数的范围是1到20次。 /^ 和 $/成对使用应该是表示要求整个字符串完全匹配定义的规则,而不是只匹配字符串中的一个子串。

    *******************************************************************************

    //校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/ ^[a-zA-Z]{1} 表示第一个字符要求是字母。([a-zA-Z0-9]|[._]){4,19} 表示从第二位开始(因为它紧跟在上个表达式后面)的一个长度为4到19位的字符串,它要求是由大小写字母、数字或者特殊字符集[._]组成。
     

    *******************************************************************************

    //校验用户姓名:只能输入1-30个以字母开头的字串/^[a-zA-Z]{1,30}$/

    *******************************************************************************

    //校验密码:只能输入6-20个字母、数字、下划线/^(w){6,20}$/ w:用于匹配字母,数字或下划线字符


    *******************************************************************************

    //校验普通电话、传真号码:可以“+”或数字开头,可含有“-” 和 “ ”/^[+]{0,1}(d){1,3}[ ]?([-]?((d)|[ ]){1,12})+$/ d:用于匹配从0到9的数字;“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次 可以匹配的字符串如:+123 -999 999 ; +123-999 999 ;123 999 999 ;+123 999999等

    *******************************************************************************

    //校验URL/^http[s]{0,1}://.+$/ 或 /^http[s]{0,1}://.{1,n}$/ (表示url串的长度为length(“https://”) + n )  / :表示字符“/”。. 表示所有字符的集+ 等同于{1,},就是1到正无穷吧。


    *******************************************************************************

    //校验纯中文字符/^[u4E00-u9FA5]+$/ [u4E00-u9FA5] :估计是中文字符集的范围吧 以上表达式均在下面的javascript中测试通过 <html><script language="JavaScript"><!--function regx(r,s){       if (r == null || r == ""){              return false;       }       var patrn= new RegExp(r);       if (patrn.exec(s))              return true       return false} --></script><body><form>       规则表达式 : <input type="input" name="regxStr" value="" > (填写/ /之间的表达式)<br>       校验字符串 : <input type="input" name="str" value="" >        <input type="button" name="match" value="匹配" onClick="alert(regx(regxStr.value,str.value));"></form></body></html>

    四、正则表达式的应用

    "^d+$"  //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$"  //正整数 "^((-d+)|(0+))$"  //非正整数(负整数 + 0) "^-[0-9]*[1-9][0-9]*$"  //负整数 "^-?d+$"    //整数 "^d+(.d+)?$"  //非负浮点数(正浮点数 + 0) "^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数 "^((-d+(.d+)?)|(0+(.0+)?))$"  //非正浮点数(负浮点数 + 0) "^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数 "^(-?d+)(.d+)?$"  //浮点数 "^[A-Za-z]+$"  //由26个英文字母组成的字符串 "^[A-Z]+$"  //由26个英文字母的大写组成的字符串 "^[a-z]+$"  //由26个英文字母的小写组成的字符串 "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串 "^w+$"  //由数字、26个英文字母或者下划线组成的字符串 "^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$"    //email地址 "^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$"  //url/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/   //  年-月-日/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/   // 月/日/年"^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"   //Emil"(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?"     //电话号码"^(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地址^([0-9A-F]{2})(-[0-9A-F]{2}){5}$   //MAC地址的正则表达式^[-+]?d+(.d+)?$  //值类型正则表达式

    五、javascript正则表达式检验

    //校验是否全由数字组成function isDigit(s){var patrn=/^[0-9]{1,20}$/;if (!patrn.exec(s)) return falsereturn true}

    //校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串function isRegisterUserName(s){var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/;if (!patrn.exec(s)) return falsereturn true}

    //校验用户姓名:只能输入1-30个以字母开头的字串function isTrueName(s){var patrn=/^[a-zA-Z]{1,30}$/;if (!patrn.exec(s)) return falsereturn true}

    //校验密码:只能输入6-20个字母、数字、下划线function isPasswd(s){var patrn=/^(w){6,20}$/;if (!patrn.exec(s)) return falsereturn true}

    //校验普通电话、传真号码:可以“+”开头,除数字外,可含有“-”function isTel(s){//var patrn=/^[+]{0,1}(d){1,3}[ ]?([-]?(d){1,12})+$/;var patrn=/^[+]{0,1}(d){1,3}[ ]?([-]?((d)|[ ]){1,12})+$/;if (!patrn.exec(s)) return falsereturn true}

    //校验手机号码:必须以数字开头,除数字外,可含有“-”function isMobil(s){var patrn=/^[+]{0,1}(d){1,3}[ ]?([-]?((d)|[ ]){1,12})+$/;if (!patrn.exec(s)) return falsereturn true}

    //校验邮政编码function isPostalCode(s){//var patrn=/^[a-zA-Z0-9]{3,12}$/;var patrn=/^[a-zA-Z0-9 ]{3,12}$/;if (!patrn.exec(s)) return falsereturn true}

    //校验搜索关键字function isSearch(s){var patrn=/^[^`~!@#$%^&*()+=|\][]{}:;',.<>/?]{1}[^`~!@$%^&()+=|\][]{}:;',.<>?]{0,19}$/;if (!patrn.exec(s)) return falsereturn true}function isIP(s) //by zergling{var patrn=/^[0-9.]{1,20}$/;if (!patrn.exec(s)) return falsereturn true}
    /********************************************************************************** FUNCTION: isBetween* PARAMETERS: val AS any value* lo AS Lower limit to check* hi AS Higher limit to check* CALLS: NOTHING* RETURNS: TRUE if val is between lo and hi both inclusive, otherwise false.**********************************************************************************/function isBetween (val, lo, hi) {if ((val < lo) || (val > hi)) { return(false); }else { return(true); }}/********************************************************************************** FUNCTION: isDate checks a valid date* PARAMETERS: theStr AS String* CALLS: isBetween, isInt* RETURNS: TRUE if theStr is a valid date otherwise false.**********************************************************************************/function isDate (theStr) {var the1st = theStr.indexOf('-');var the2nd = theStr.lastIndexOf('-');if (the1st == the2nd) { return(false); }else {var y = theStr.substring(0,the1st);var m = theStr.substring(the1st+1,the2nd);var d = theStr.substring(the2nd+1,theStr.length);var maxDays = 31;if (isInt(m)==false || isInt(d)==false || isInt(y)==false) {return(false); }else if (y.length < 4) { return(false); }else if (!isBetween (m, 1, 12)) { return(false); }else if (m==4 || m==6 || m==9 || m==11) maxDays = 30;else if (m==2) {if (y % 4 > 0) maxDays = 28;else if (y % 100 == 0 && y % 400 > 0) maxDays = 28;else maxDays = 29;}if (isBetween(d, 1, maxDays) == false) { return(false); }else { return(true); }}}/********************************************************************************** FUNCTION: isEuDate checks a valid date in British format* PARAMETERS: theStr AS String* CALLS: isBetween, isInt* RETURNS: TRUE if theStr is a valid date otherwise false.**********************************************************************************/function isEuDate (theStr) {if (isBetween(theStr.length, 8, 10) == false) { return(false); }else {var the1st = theStr.indexOf('/');var the2nd = theStr.lastIndexOf('/');if (the1st == the2nd) { return(false); }else {var m = theStr.substring(the1st+1,the2nd);var d = theStr.substring(0,the1st);var y = theStr.substring(the2nd+1,theStr.length);var maxDays = 31;if (isInt(m)==false || isInt(d)==false || isInt(y)==false) {return(false); }else if (y.length < 4) { return(false); }else if (isBetween (m, 1, 12) == false) { return(false); }else if (m==4 || m==6 || m==9 || m==11) maxDays = 30;else if (m==2) {if (y % 4 > 0) maxDays = 28;else if (y % 100 == 0 && y % 400 > 0) maxDays = 28;else maxDays = 29;}if (isBetween(d, 1, maxDays) == false) { return(false); }else { return(true); }}}}/********************************************************************************* FUNCTION: Compare Date! Which is the latest!* PARAMETERS: lessDate,moreDate AS String* CALLS: isDate,isBetween* RETURNS: TRUE if lessDate<moreDate*********************************************************************************/function isComdate (lessDate , moreDate){if (!isDate(lessDate)) { return(false);}if (!isDate(moreDate)) { return(false);}var less1st = lessDate.indexOf('-');var less2nd = lessDate.lastIndexOf('-');var more1st = moreDate.indexOf('-');var more2nd = moreDate.lastIndexOf('-');var lessy = lessDate.substring(0,less1st);var lessm = lessDate.substring(less1st+1,less2nd);var lessd = lessDate.substring(less2nd+1,lessDate.length);var morey = moreDate.substring(0,more1st);var morem = moreDate.substring(more1st+1,more2nd);var mored = moreDate.substring(more2nd+1,moreDate.length);var Date1 = new Date(lessy,lessm,lessd); var Date2 = new Date(morey,morem,mored); if (Date1>Date2) { return(false);}return(true);}/********************************************************************************** FUNCTION isEmpty checks if the parameter is empty or null* PARAMETER str AS String**********************************************************************************/function isEmpty (str) {if ((str==null)||(str.length==0)) return true;else return(false);}/********************************************************************************** FUNCTION: isInt* PARAMETER: theStr AS String * RETURNS: TRUE if the passed parameter is an integer, otherwise FALSE* CALLS: isDigit**********************************************************************************/function isInt (theStr) {var flag = true;if (isEmpty(theStr)) { flag=false; }else{ for (var i=0; i<theStr.length; i++) {if (isDigit(theStr.substring(i,i+1)) == false) {flag = false; break;}}}return(flag);}/********************************************************************************** FUNCTION: isReal* PARAMETER: heStr AS String decLen AS Integer (how many digits after period)* RETURNS: TRUE if theStr is a float, otherwise FALSE* CALLS: isInt**********************************************************************************/function isReal (theStr, decLen) {var dot1st = theStr.indexOf('.');var dot2nd = theStr.lastIndexOf('.');var OK = true;if (isEmpty(theStr)) return false;if (dot1st == -1) {if (!isInt(theStr)) return(false);else return(true);}else if (dot1st != dot2nd) return (false);else if (dot1st==0) return (false);else {var intPart = theStr.substring(0, dot1st);var decPart = theStr.substring(dot2nd+1);if (decPart.length > decLen) return(false);else if (!isInt(intPart) || !isInt(decPart)) return (false);else if (isEmpty(decPart)) return (false);else return(true);}}/********************************************************************************** FUNCTION: isEmail* PARAMETER: String (Email Address)* RETURNS: TRUE if the String is a valid Email address* FALSE if the passed string is not a valid Email Address* EMAIL FORMAT: AnyName@EmailServer e.g; webmaster@hotmail.com* @ sign can appear only once in the email address.*********************************************************************************/function isEmail (theStr) {var atIndex = theStr.indexOf('@');var dotIndex = theStr.indexOf('.', atIndex);var flag = true;theSub = theStr.substring(0, dotIndex+1)if ((atIndex < 1)||(atIndex != theStr.lastIndexOf('@'))||(dotIndex < atIndex + 2)||(theStr.length <= theSub.length)) { return(false); }else { return(true); }}/********************************************************************************** FUNCTION: newWindow* PARAMETERS: doc -> Document to open in the new windowhite -> Height of the new windowwide -> Width of the new windowbars -> 1-Scroll bars = YES 0-Scroll Bars = NOresize -> 1-Resizable = YES 0-Resizable = NO* CALLS: NONE* RETURNS: New window instance**********************************************************************************/function newWindow (doc, hite, wide, bars, resize) {var winNew="_blank";var opt="toolbar=0,location=0,directories=0,status=0,menubar=0,";opt+=("scrollbars="+bars+",");opt+=("resizable="+resize+",");opt+=("width="+wide+",");opt+=("height="+hite);winHandle=window.open(doc,winNew,opt);return;}/********************************************************************************** FUNCTION: DecimalFormat* PARAMETERS: paramValue -> Field value* CALLS: NONE* RETURNS: Formated string**********************************************************************************/function DecimalFormat (paramValue) {var intPart = parseInt(paramValue);var decPart =parseFloat(paramValue) - intPart;str = "";if ((decPart == 0) || (decPart == null)) str += (intPart + ".00");else str += (intPart + decPart);return (str);} "^d+$"  //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$"  //正整数 "^((-d+)|(0+))$"  //非正整数(负整数 + 0) "^-[0-9]*[1-9][0-9]*$"  //负整数 "^-?d+$"    //整数 "^d+(.d+)?$"  //非负浮点数(正浮点数 + 0) "^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数 "^((-d+(.d+)?)|(0+(.0+)?))$"  //非正浮点数(负浮点数 + 0) "^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数 "^(-?d+)(.d+)?$"  //浮点数 "^[A-Za-z]+$"  //由26个英文字母组成的字符串 "^[A-Z]+$"  //由26个英文字母的大写组成的字符串 "^[a-z]+$"  //由26个英文字母的小写组成的字符串 "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串 "^w+$"  //由数字、26个英文字母或者下划线组成的字符串 "^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$"    //email地址 "^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$"  //url

    一、JAVA正则表达式语法示例


    1、匹配验证-验证Email是否正确

    public static void main(String[] args) {    // 要验证的字符串    String str = "service@xsoftlab.net";    // 邮箱验证规则    String regEx = "[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}.){1,3}[a-zA-z-]{1,}";    // 编译正则表达式    Pattern pattern = Pattern.compile(regEx);    // 忽略大小写的写法    // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);    Matcher matcher = pattern.matcher(str);    // 字符串是否与正则表达式相匹配    boolean rs = matcher.matches();    System.out.println(rs);}

    2、在字符串中查询字符或者字符串

    public static void main(String[] args) {    // 要验证的字符串    String str = "baike.xsoftlab.net";    // 正则表达式规则    String regEx = "baike.*";    // 编译正则表达式    Pattern pattern = Pattern.compile(regEx);    // 忽略大小写的写法    // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);    Matcher matcher = pattern.matcher(str);    // 查找字符串中是否有匹配正则表达式的字符/字符串    boolean rs = matcher.find();    System.out.println(rs);}

    3、更多。。。

    [正则表达式]文本框输入内容控制整数或者小数:^[0-9]+.{0,1}[0-9]{0,2}$只能输入数字:"^[0-9]*$"。只能输入n位的数字:"^d{n}$"。只能输入至少n位的数字:"^d{n,}$"。只能输入m~n位的数字:。"^d{m,n}$"只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。只能输入非零的正整数:"^+?[1-9][0-9]*$"。只能输入非零的负整数:"^-[1-9][]0-9"*$。只能输入长度为3的字符:"^.{3}$"。只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。只能输入由数字、26个英文字母或者下划线组成的字符串:"^w+$"。验证用户密码:"^[a-zA-Z]w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。验证是否含有^%&',;=?$"等字符:"[^%&',;=?$x22]+"。只能输入汉字:"^[u4e00-u9fa5]{0,}$"验证Email地址:"^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$"。验证InternetURL:"^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$"。验证电话号码:"^((d{3,4}-)|d{3.4}-)?d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。验证身份证号(15位或18位数字):"^d{15}|d{18}$"。验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。匹配中文字符的正则表达式: [u4e00-u9fa5]匹配双字节字符(包括汉字在内):[^x00-xff]应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)String.prototype.len=function(){return this.replace(/[^x00-xff]/g,"aa").length;}匹配空行的正则表达式:
    [s| ]*
    匹配html标签的正则表达式:<(.*)>(.*)</(.*)>|<(.*)/>匹配首尾空格的正则表达式:(^s*)|(s*$)应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:String.prototype.trim = function(){return this.replace(/(^s*)|(s*$)/g, "");}利用正则表达式分解和转换IP地址:下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:function IP2V(ip){re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正则表达式if(re.test(ip)){return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1}else{throw new Error("Not a valid IP address!")}}不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:var ip="10.100.20.168"ip=ip.split(".")alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?利用正则表达式限制网页表单里的文本框输入内容:用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))"用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))"用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"<input onkeyup="value=value.replace(/[^u4E00-u9FA5w]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5w]/g,''))" value="允许下划线,数字字母和汉字"><script language="javascript">if (document.layers)//触发键盘事件document.captureEvents(Event.KEYPRESS)function xz(thsv,nob){if(nob=="2"){window.clipboardData.setData("text","")alert("避免非法字符输入,请勿复制字符");return false;}if (event.keyCode!=8 && event.keyCode!=16 && event.keyCode!=37 && event.keyCode!=38 && event.keyCode!=39 && event.keyCode!=40){thsvv=thsv.value;//输入的值thsvs=thsvv.substring(thsvv.length-1);//输入的最后一个字符//thsvss=thsvv.substring(0,thsvv.length-1);//去掉最后一个错误字符if (!thsvs.replace(/[^u4E00-u9FA5w]/g,'') || event.keyCode==189){//正则除去符号和下划线 keythsv.value='请勿输入非法符号 ['+thsvs+']';alert('请勿输入非法符号 ['+thsvs+']');thsv.value="";return false;}}}</script><input onkeyup="xz(this,1)" onPaste="xz(this,2)" value="">允许数字字母和汉字<script language="javascript"><!--function MaxLength(field,maxlimit){var j = field.value.replace(/[^x00-xff]/g,"**").length;//alert(j);var tempString=field.value;var tt="";if(j > maxlimit){for(var i=0;i<maxlimit;i++){if(tt.replace(/[^x00-xff]/g,"**").length < maxlimit)tt = tempString.substr(0,i+1);elsebreak;}if(tt.replace(/[^x00-xff]/g,"**").length > maxlimit)tt=tt.substr(0,tt.length-1);field.value = tt;}else{;}}</script>单行文本框控制<br /><INPUT type="text" id="Text1" name="Text1" onpropertychange="MaxLength(this, 5)"><br />多行文本框控制:<br /><TEXTAREA rows="14"cols="39" id="Textarea1" name="Textarea1" onpropertychange="MaxLength(this, 15)"></TEXTAREA><br />控制表单内容只能输入数字,中文....<script>function test()  {if(document.a.b.value.length>50){alert("不能超过50个字符!");document.a.b.focus();return false;}}</script><form name=a onsubmit="return test()"><textarea name="b" cols="40" wrap="VIRTUAL" rows="6"></textarea><input type="submit" name="Submit" value="check"></form>只能是汉字<input onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'')">只能是英文字符<script language=javascript>function onlyEng(){if(!(event.keyCode>=65&&event.keyCode<=90))    event.returnValue=false;}</script><input onkeydown="onlyEng();"><input name="coname" type="text" size="50" maxlength="35" class="input2" onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))">只能是数字<script language=javascript>function onlyNum(){if(!((event.keyCode>=48&&event.keyCode<=57)||(event.keyCode>=96&&event.keyCode<=105)))//考虑小键盘上的数字键    event.returnValue=false;}</script><input onkeydown="onlyNum();">只能是英文字符和数字<input onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))">验证为email格式<SCRIPT LANGUAGE=Javascript RUNAT=Server>function isEmail(strEmail) {if (strEmail.search(/^w+((-w+)|(.w+))*@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+)*.[A-Za-z0-9]+$/) != -1)
                    
                        
    这篇文章主要介绍了PowerShell常用正则表达式和语法参考,主要介绍PowerShell中的正则表达式和其含义,需要的朋友可以参考下本文介绍PowerShell中的正则表达式,各种不同的字符代表不同的含义,包括占位符PlaceHolder、量词Quantifier和边界字符。

    下面列举PowerShell的正则表达式中可能出现的字符,以及它们表示的含义。


    一、字符串的匹配符(占位符PlaceHolder)

    . 这是一个点儿,表示换行符之外的任意一个字符(Any character except newline (Equivalent: [^
    ]))[^abc] 指定的字符(abc)之外的任意一个字符,可以把abc换成其它字符组。(All characters except the ones specified)[^a-z] 任意一个非小写字母的字符(All characters except those in the region specified)[abc] 指定的字符集中的任意一个,即abc中的任意一个(One of the characters)[a-z] 指定的字符范围中的任意一个,即任意一个小写字母。One of the characters in the regiona 响呤(Bell (ASCII 7))c Any character allowed in XML namescA-cZ Control+A to Control+Z, ASCII 1 to ASCII 26d 任意一个数字,等同于[0-9](Any number (Equivalent: [0-9]))D 任意一个非数字。Any non-numbere ESC键(Escape (ASCII 27))f Form Feed, (ASCII 12)
     换行Line break
     回车Carriage returns 任意一个空白键(空白键如tab,换行)Any whitespace (space, tab, new line)S 任意一个非空白字符(Any non-whitespace)	 tab键w 字母,数字和下划线(Letter, number or underline)W w的补集(Non-letter, number, or underline)

    二、匹配次数(量词Quantifier)

    * 出现零次、1次、多次(Any (no occurrence, once, many times))? 出现零次、1次(No occurrence or one occurrence){n,} 出现至少n次(At least n occurrences){n,m} 出现至少n次,最多m次(At least n occurrences, maximum m occurrences){n} 出现n次(Exactly n occurrences)+ 出现1次、多次(One or many occurrences)所有的匹配次数的符号,默认情况下都是贪婪的,即它将最大长度的进行匹配。如果想要得到最短的匹配,那就要在上面这组符号之后加一个问号(?)。

    四、匹配边界

    $ 字符串结束(End of text)^ 字符串开始(Start of text) Word boundaryB No word boundaryG After last match (no overlaps)

    关于PowerShell正则表达式参考,本文就介绍这么多,希望对您有所帮助,谢谢!

    replace()最js中比较简单的字符替换函数,但是它也是可以跟正则结合实现强大的字符替换效果。

    示例代码如下:

     <script language="javascript"> var strM = "javascript is a good script language"; //在此我想将字母a替换成字母A alert(strM.replace("a","A")); </script> 
    它只替换了首字母。但如果加上正则表达式结果就不一样了!replace()支持正则表达式,它可以按照正则表达式的规则匹配字符或字符串,然后给予替换! 

    注意:被替换的部分不用加双引号。

     <script language="javascript"> var strM = "javascript is a good script language"; //在此我想将字母a替换成字母A alert(strM.replace(/a/,"A")); </script> 

    这样还是只替换了第一个字母a。 
     <script language="javascript"> var strM = "javascript is a good script language"; //在此将字母a全部替换成字母A alert(strM.replace(/a/g,"A")); </script> 
    由上可知,当正则表达式有"g"标志时,代表将处理整个字符串。

     <script language="javascript"> var strM = "javascript is a good script language"; alert(strM.replace(/(javascript)s*(is)/g,"$1 $2 fun. it $2")); </script> 
    先看看简单例子:将所有单词首字母换成大写。 
     <script language="javascript"> var strM = "javascript is a good script language"; function change(word) { return word.indexOf(0).toUpperCase()+word.substring(1); } alert(strM.replace(/w+/g,change)); </script> 
    由上可知,当正则表达式有"g"标志时,代表将处理整个字符串,即函数change的变换将应用于所有匹配的对象。而该函数有三个或更多参数,具体个数视正则表达式而定。 

    有了函数与正则表达式的配合,replace()处理字符串的功能空前强大起来了! 

    最后还举个例子,将字符串所有单词倒序,用replace()处理是如此简单。 
     <script language="javascript"> var strM = "javascript is a good script language"; function change(word) { var result = word.match(/(w)/g); if ( result ) { var str = ""; for ( var i=result.length-1; i>=0; i-- ) { str += result; } return str; } else { return "null"; } } alert(strM.replace(/(w)+/g,change)); </script> 




    特殊表达式 :


    货币格式: '123123211312.333333'.replace(/(?=(?!^)(?:d{3})+(?:.|$))(d{3}(.d+$)?)/g, ',$1') //输出 123,123,211,312.333333  ps:TCL 大牛推荐


    匹配中文字符的正则表达式: [u4e00-u9fa5]   
      评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 

    匹配双字节字符(包括汉字在内):[^x00-xff] 
      评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 

    匹配空白行的正则表达式:ns*r 
      评注:可以用来删除空白行 

    匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?|<.*? /> 
      评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力 

    匹配首尾空白字符的正则表达式:^s*|s*$ 
      评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式 

    匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 
      评注:表单验证时很实用 

    匹配网址URL的正则表达式:[a-zA-z]+://[^s]* 
      评注:网上流传的版本功能很有限,上面这个基本可以满足需求 

    匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 
      评注:表单验证时很实用 

    匹配国内电话号码:d{3}-d{8}|d{4}-d{7} 
      评注:匹配形式如 0511-4405222 或 021-87888822 

    匹配腾讯QQ号:[1-9][0-9]{4,} 
      评注:腾讯QQ号从10000开始 

    匹配中国邮政编码:[1-9]d{5}(?!d) 
      评注:中国邮政编码为6位数字 

    匹配身份证:d{15}|d{18} 
      评注:中国的身份证为15位或18位 

    匹配ip地址:d+.d+.d+.d+ 
      评注:提取ip地址时有用 

    匹配特定数字: 
      ^[1-9]d*$    //匹配正整数 
      ^-[1-9]d*$   //匹配负整数 
      ^-?[1-9]d*$   //匹配整数 
      ^[1-9]d*|0$  //匹配非负整数(正整数 + 0) 
      ^-[1-9]d*|0$   //匹配非正整数(负整数 + 0) 
      ^[1-9]d*.d*|0.d*[1-9]d*$   //匹配正浮点数 
      ^-([1-9]d*.d*|0.d*[1-9]d*)$  //匹配负浮点数 
      ^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$  //匹配浮点数 
      ^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$   //匹配非负浮点数(正浮点数 + 0) 
      ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$  //匹配非正浮点数(负浮点数 + 0) 
      评注:处理大量数据时有用,具体应用时注意修正 

    匹配特定字符串: 
      ^[A-Za-z]+$  //匹配由26个英文字母组成的字符串 
      ^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串 
      ^[a-z]+$  //匹配由26个英文字母的小写组成的字符串 
      ^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串 
      ^w+$  //匹配由数字、26个英文字母或者下划线组成的字符串 

    在使用RegularExpressionValidator验证控件时的验证功能及其验证表达式介绍如下: 
      只能输入数字:“^[0-9]*$” 
      只能输入n位的数字:“^d{n}$” 
      只能输入至少n位数字:“^d{n,}$” 
      只能输入m-n位的数字:“^d{m,n}$” 
      只能输入零和非零开头的数字:“^(0|[1-9][0-9]*)$” 
      只能输入有两位小数的正实数:“^[0-9]+(.[0-9]{2})?$” 
      只能输入有1-3位小数的正实数:“^[0-9]+(.[0-9]{1,3})?$” 
      只能输入非零的正整数:“^+?[1-9][0-9]*$” 
      只能输入非零的负整数:“^-[1-9][0-9]*$” 
      只能输入长度为3的字符:“^.{3}$” 
      只能输入由26个英文字母组成的字符串:“^[A-Za-z]+$” 
      只能输入由26个大写英文字母组成的字符串:“^[A-Z]+$” 
      只能输入由26个小写英文字母组成的字符串:“^[a-z]+$” 
      只能输入由数字和26个英文字母组成的字符串:“^[A-Za-z0-9]+$” 
      只能输入由数字、26个英文字母或者下划线组成的字符串:“^w+$” 

    验证用户密码:“^[a-zA-Z]w{5,17}$”正确格式为:以字母开头,长度在6-18之间, 只能包含字符、数字和下划线。 

    验证是否含有^%&'',;=?$"等字符:“[^%&'',;=?$x22]+” 

    只能输入汉字:“^[u4e00-u9fa5],{0,}$” 


    验证Email地址:“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$” 

    验证InternetURL:“^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$” 

    验证电话号码:“^((d{3,4})|d{3,4}-)?d{7,8}$” 
      正确格式为:“XXXX-XXXXXXX”,“XXXX-XXXXXXXX”,“XXX-XXXXXXX”, 
      “XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”。 

    验证身份证号(15位或18位数字):“^d{15}|d{}18$” 

    验证一年的12个月:“^(0?[1-9]|1[0-2])$”正确格式为:“01”-“09”和“1”“12” 

    验证一个月的31天:“^((0?[1-9])|((1|2)[0-9])|30|31)$” 
      正确格式为:“01”“09”和“1”“31”。 

    匹配中文字符的正则表达式: [u4e00-u9fa5] 

    匹配双字节字符(包括汉字在内):[^x00-xff] 

    匹配空行的正则表达式:n[s| ]*r 

    匹配HTML标记的正则表达式:/<(.*)>.*|<(.*) />/ 

    匹配首尾空格的正则表达式:(^s*)|(s*$) 

    匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 

    匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)? 
      (1)应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 
      String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").length;} 
      (2)应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现 
      String.prototype.trim = function() 
      { 
      return this.replace(/(^s*)|(s*$)/g, ""); 
      } 
      (3)应用:利用正则表达式分解和转换IP地址 
      function IP2V(ip) //IP地址转换成对应数值 
      { 
      re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正则表达式 
      if(re.test(ip)) 
      { 
      return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1 
      } 
      else 
      { 
      throw new Error("Not a valid IP address!") 
      } 
      } 
      (4)应用:从URL地址中提取文件名的javascript程序 
      s="http://www.9499.net/page1.htm"; 
      s=s.replace(/(.*/){0,}([^.]+).*/ig,"$2") ;//Page1.htm 
      (5)应用:利用正则表达式限制网页表单里的文本框输入内容 
      用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'') "onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^u4E00-u9FA5]/g,''))" 
      用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'') "onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^uFF00-uFFFF]/g,''))" 
      用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^d]/g,'') "onbeforepaste= "clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^d]/g,''))" 
      用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^d]/g,''

    1.    平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用: 2.    "^d+$"  //非负整数(正整数 + 0) 3.    "^[0-9]*[1-9][0-9]*$"  //正整数 4.    "^((-d+)|(0+))$"  //非正整数(负整数 + 0) 5.    "^-[0-9]*[1-9][0-9]*$"  //负整数 6.    "^-?d+$"    //整数 7.    "^d+(.d+)?$"  //非负浮点数(正浮点数 + 0) 8.    "^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数 9.    "^((-d+(.d+)?)|(0+(.0+)?))$"  //非正浮点数(负浮点数 + 0) 10.    "^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数 11.    "^(-?d+)(.d+)?$"  //浮点数 12.    "^[A-Za-z]+$"  //由26个英文字母组成的字符串 13.    "^[A-Z]+$"  //由26个英文字母的大写组成的字符串 14.    "^[a-z]+$"  //由26个英文字母的小写组成的字符串 15.    "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串 16.    "^w+$"  //由数字、26个英文字母或者下划线组成的字符串 17.    "^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$"    //email地址 18.    "^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$"  //url 19.    /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/   //  年-月-日 20.    /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/   // 月/日/年 21.    "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"   //Emil 22.    /^((+?[0-9]{2,4}-[0-9]{3,4}-)|([0-9]{3,4}-))?([0-9]{7,8})(-[0-9]+)?$/     //电话号码 23.    "^(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地址 24.    25.    匹配中文字符的正则表达式: [u4e00-u9fa5] 26.    匹配双字节字符(包括汉字在内):[^x00-xff] 27.    匹配空行的正则表达式:
    [s| ]*
     28.    匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/ 29.    匹配首尾空格的正则表达式:(^s*)|(s*$) 30.    匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 31.    匹配网址URL的正则表达式:^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$ 32.    匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 33.    匹配国内电话号码:(d{3}-|d{4}-)?(d{8}|d{7})? 34.    匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$ 35.    36.    37.    元字符及其在正则表达式上下文中的行为: 38.    39.     将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。 40.    41.    ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 ’
    ’ 或 ’
    ’ 之后的位置。 42.    43.    $ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性,$ 也匹配 ’
    ’ 或 ’
    ’ 之前的位置。 44.    45.    * 匹配前面的子表达式零次或多次。 46.    47.    + 匹配前面的子表达式一次或多次。+ 等价于 {1,}。 48.    49.    ? 匹配前面的子表达式零次或一次。? 等价于 {0,1}。 50.    51.    {n} n 是一个非负整数,匹配确定的n 次。 52.    53.    {n,} n 是一个非负整数,至少匹配n 次。 54.    55.    {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。 56.    57.    ? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。 58.    59.    . 匹配除 "
    " 之外的任何单个字符。要匹配包括 ’
    ’ 在内的任何字符,请使用象 ’[.
    ]’ 的模式。 60.    (pattern) 匹配pattern 并获取这一匹配。 61.    62.    (?:pattern) 匹配pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。 63.    64.    (?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。 65.    66.    (?!pattern) 负向预查,与(?=pattern)作用相反 67.    68.    x|y 匹配 x 或 y。 69.    70.    [xyz] 字符集合。 71.    72.    [^xyz] 负值字符集合。 73.    74.    [a-z] 字符范围,匹配指定范围内的任意字符。 75.    76.    [^a-z] 负值字符范围,匹配任何不在指定范围内的任意字符。 77.    78.     匹配一个单词边界,也就是指单词和空格间的位置。 79.    80.    B 匹配非单词边界。 81.    82.    cx 匹配由x指明的控制字符。 83.    84.    d 匹配一个数字字符。等价于 [0-9]。 85.    86.    D 匹配一个非数字字符。等价于 [^0-9]。 87.    88.    f 匹配一个换页符。等价于 x0c 和 cL。 89.    90.    
     匹配一个换行符。等价于 x0a 和 cJ。 91.    92.    
     匹配一个回车符。等价于 x0d 和 cM。 93.    94.    s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ f
    
    	v]。 95.    96.    S 匹配任何非空白字符。等价于 [^ f
    
    	v]。 97.    98.    	 匹配一个制表符。等价于 x09 和 cI。 99.    100.    v 匹配一个垂直制表符。等价于 x0b 和 cK。 101.    102.    w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。 103.    104.    W 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。 105.    106.    xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。 107.    108.    
    um 匹配 num,其中num是一个正整数。对所获取的匹配的引用。 109.    110.    
     标识一个八进制转义值或一个后向引用。如果 
     之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。 111.    112.    
    m 标识一个八进制转义值或一个后向引用。如果 
    m 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 
    m 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 
    m 将匹配八进制转义值 nm。 113.    114.    
    ml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。 115.    116.    un 匹配 n,其中 n 是一个用四个十六进制数字表示的Unicode字符。 117.    118.    匹配中文字符的正则表达式: [u4e00-u9fa5] 119.    120.    匹配双字节字符(包括汉字在内):[^x00-xff] 121.    122.    匹配空行的正则表达式:n[s| ]*r 123.    124.    匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/ 125.    126.    匹配首尾空格的正则表达式:(^s*)|(s*$) 127.    128.    匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 129.    130.    匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)? 131.    132.    利用正则表达式限制网页表单里的文本框输入内容: 133.    134.    用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))" 135.    136.    用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))" 137.    138.    用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))" 139.    140.    用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))" 141.    142.    =========常用正则式 143.    144.    145.    146.    匹配中文字符的正则表达式: [u4e00-u9fa5] 147.    148.    匹配双字节字符(包括汉字在内):[^x00-xff] 149.    150.    匹配空行的正则表达式:
    [s| ]*
     151.    152.    匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/ 153.    154.    匹配首尾空格的正则表达式:(^s*)|(s*$) 155.    156.    匹配IP地址的正则表达式:/(d+).(d+).(d+).(d+)/g // 157.    158.    匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 159.    160.    匹配网址URL的正则表达式:http://(/[w-]+.)+[w-]+(/[w- ./?%&=]*)? 161.    162.    sql语句:^(select|drop|delete|create|update|insert).*$ 163.    164.    1、非负整数:^d+$ 165.    166.    2、正整数:^[0-9]*[1-9][0-9]*$ 167.    168.    3、非正整数:^((-d+)|(0+))$ 169.    170.    4、负整数:^-[0-9]*[1-9][0-9]*$ 171.    172.    5、整数:^-?d+$ 173.    174.    6、非负浮点数:^d+(.d+)?$ 175.    176.    7、正浮点数:^((0-9)+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$ 177.    178.    8、非正浮点数:^((-d+.d+)?)|(0+(.0+)?))$ 179.    180.    9、负浮点数:^(-((正浮点数正则式)))$ 181.    182.    10、英文字符串:^[A-Za-z]+$ 183.    184.    11、英文大写串:^[A-Z]+$ 185.    186.    12、英文小写串:^[a-z]+$ 187.    188.    13、英文字符数字串:^[A-Za-z0-9]+$ 189.    190.    14、英数字加下划线串:^w+$ 191.    192.    15、E-mail地址:^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$ 193.    194.    16、URL:^[a-zA-Z]+://(w+(-w+)*)(.(w+(-w+)*))*(?s*)?$ 195.    或:^http://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&_~`@[]':+!]*([^<>""])*$ 196.    197.    17、邮政编码:^[1-9]d{5}$ 198.    199.    18、中文:^[u0391-uFFE5]+$ 200.    201.    19、电话号码:^(((d{2,3}))|(d{3}-))?((0d{2,3})|0d{2,3}-)?[1-9]d{6,7}(-d{1,4})?$ 202.    203.    20、手机号码:^(((d{2,3}))|(d{3}-))?13d{9}$ 204.    205.    21、双字节字符(包括汉字在内):^x00-xff 206.    207.    22、匹配首尾空格:(^s*)|(s*$)(像vbscript那样的trim函数) 208.    209.    23、匹配HTML标记:<(.*)>.*</1>|<(.*) /> 210.    211.    24、匹配空行:
    [s| ]*
     212.    213.    25、提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(w||/|.)+('|"| *|>)? 214.    215.    26、提取信息中的邮件地址:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 216.    217.    27、提取信息中的图片链接:(s|S)(r|R)(c|C) *= *('|")?(w||/|.)+('|"| *|>)? 218.    219.    28、提取信息中的IP地址:(d+).(d+).(d+).(d+) 220.    221.    29、提取信息中的中国手机号码:(86)*0*13d{9} 222.    223.    30、提取信息中的中国固定电话号码:((d{3,4})|d{3,4}-|s)?d{8} 224.    225.    31、提取信息中的中国电话号码(包括移动和固定电话):((d{3,4})|d{3,4}-|s)?d{7,14} 226.    227.    32、提取信息中的中国邮政编码:[1-9]{1}(d+){5} 228.    229.    33、提取信息中的浮点数(即小数):(-?d*).?d+ 230.    231.    34、提取信息中的任何数字 :(-?d*)(.d+)? 232.    233.    35、IP:(d+).(d+).(d+).(d+) 234.    235.    36、电话区号:/^0d{2,3}$/ 236.    237.    37、腾讯QQ号:^[1-9]*[1-9][0-9]*$ 238.    239.    38、帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 240.    241.    39、中文、英文、数字及下划线:^[u4e00-u9fa5_a-zA-Z0-9]+$


    正则表达式是为复杂搜索指定模式的强大方式。

    正则表达式描述了一组字符串。最简单的正则表达式是不含任何特殊字符的正则表达式。例如,正则表达式hello匹配hello

    非平凡的正则表达式采用了特殊的特定结构,从而使得它们能够与1个以上的字符串匹配。例如,正则表达式hello|word匹配字符串hello或字符串word

    作为一个更为复杂的示例,正则表达式B[an]*s匹配下述字符串中的任何一个:BananasBaaaaasBs以及以B开始、以s结束、并在其中包含任意数目an字符的任何其他字符串。

    对于REGEXP操作符,正则表达式可以使用任何下述特殊字符和结构:

    ·         ^

    匹配字符串的开始部分。

    mysql> SELECT 'fo/nfo' REGEXP '^fo$';                   -> 0
    mysql> SELECT 'fofo' REGEXP '^fo';                      -> 1

    ·         $

    匹配字符串的结束部分。

    mysql> SELECT 'fo/no' REGEXP '^fo/no$';                 -> 1
    mysql> SELECT 'fo/no' REGEXP '^fo$';                    -> 0

    ·         .

    匹配任何字符(包括回车和新行)。

    mysql> SELECT 'fofo' REGEXP '^f.*$';                    -> 1
    mysql> SELECT 'fo/r/nfo' REGEXP '^f.*$';                -> 1
     SELECT 'f' REGEXP '^f.';                                               ->0
    SELECT 'f1' REGEXP '^f.';                                            ->1

    ·         a*

    匹配0或多个a字符的任何序列。

    mysql> SELECT 'Ban' REGEXP '^Ba*n';                     -> 1
    mysql> SELECT 'Baaan' REGEXP '^Ba*n';                   -> 1
    mysql> SELECT 'Bn' REGEXP '^Ba*n';                      -> 1
    SELECT 'f' REGEXP '^f*';                                                ->1

    ·         a+

    匹配1个或多个a字符的任何序列。

    mysql> SELECT 'Ban' REGEXP '^Ba+n';                     -> 1
    mysql> SELECT 'Bn' REGEXP '^Ba+n';                      -> 0
    SELECT 'faaCC' REGEXP '^fA+';                                   ->1

    ·         a?

    匹配0个或1a字符。

    mysql> SELECT 'Bn' REGEXP '^Ba?n';                      -> 1
    mysql> SELECT 'Ban' REGEXP '^Ba?n';                     -> 1
    mysql> SELECT 'Baan' REGEXP '^Ba?n';                    -> 0

    ·         de|abc

    匹配序列deabc

    mysql> SELECT 'pi' REGEXP 'pi|apa';                     -> 1
    mysql> SELECT 'axe' REGEXP 'pi|apa';                    -> 0
    mysql> SELECT 'apa' REGEXP 'pi|apa';                    -> 1
    mysql> SELECT 'apa' REGEXP '^(pi|apa)$';                -> 1
    mysql> SELECT 'pi' REGEXP '^(pi|apa)$';                 -> 1
    mysql> SELECT 'pix' REGEXP '^(pi|apa)$';                -> 0

    ·         (abc)*

    匹配序列abc0个或多个实例。

    mysql> SELECT 'pi' REGEXP '^(pi)*$';                    -> 1
    mysql> SELECT 'pip' REGEXP '^(pi)*$';                   -> 0
    mysql> SELECT 'pipi' REGEXP '^(pi)*$';                  -> 1

    ·         {1},{2,3}

    {n}{m,n}符号提供了编写正则表达式的更通用方式,能够匹配模式的很多前述原子(或部分)。mn均为整数。

    o        a*

    可被写入为a{0,}

    o        a+

    可被写入为a{1,}

    o        a?

    可被写入为a{0,1}

    更准确地讲,a{n}an个实例准确匹配。a{n,}匹配an个或更多实例。a{m,n}匹配amn个实例,包含mn

    mn必须位于0RE_DUP_MAX(默认为255)的范围内,包含0RE_DUP_MAX。如果同时给定了mnm必须小于或等于n

    mysql> SELECT 'abcde' REGEXP 'a[bcd]{2}e';              -> 0
    mysql> SELECT 'abcde' REGEXP 'a[bcd]{3}e';              -> 1
    mysql> SELECT 'abcde' REGEXP 'a[bcd]{1,10}e';           -> 1

    ·         [a-dX],[^a-dX]

    匹配任何是(或不是,如果使用^的话)a、b、c、d或X的字符。两个其他字符之间的“-”字符构成一个范围,与从第1个字符开始到第2个字符之间的所有字符匹配。例如,[0-9]匹配任何十进制数字 。要想包含文字字符“]”,它必须紧跟在开括号“[”之后。要想包含文字字符“-”,它必须首先或最后写入。对于[]对内未定义任何特殊含义的任何字符,仅与其本身匹配。

    mysql> SELECT 'aXbc' REGEXP '[a-dXYZ]';                 -> 1
    mysql> SELECT 'aXbc' REGEXP '^[a-dXYZ]$';               -> 0
    mysql> SELECT 'aXbc' REGEXP '^[a-dXYZ]+$';              -> 1
    mysql> SELECT 'aXbc' REGEXP '^[^a-dXYZ]+$';             -> 0
    mysql> SELECT 'gheis' REGEXP '^[^a-dXYZ]+$';            -> 1
    mysql> SELECT 'gheisa' REGEXP '^[^a-dXYZ]+$';           -> 0

    ·         [.characters.]

    在括号表达式中(使用[]),匹配用于校对元素的字符序列。字符为单个字符或诸如新行等字符名。在文件regexp/cname.h中,可找到字符名称的完整列表。

    mysql> SELECT '~' REGEXP '[[.~.]]';                     -> 1
    mysql> SELECT '~' REGEXP '[[.tilde.]]';                 -> 1

    ·         [=character_class=]

    在括号表达式中(使用[和]),[=character_class=]表示等同类。它与具有相同校对值的所有字符匹配,包括它本身,例如,如果o和(+)均是等同类的成员,那么[[=o=]]、[[=(+)=]]和[o(+)]是同义词。等同类不得用作范围的端点。

    ·         [:character_class:]

    在括号表达式中(使用[和]),[:character_class:]表示与术语类的所有字符匹配的字符类。标准的类名称是:

    alnum

    文字数字字符

    alpha

    文字字符

    blank

    空白字符

    cntrl

    控制字符

    digit

    数字字符

    graph

    图形字符

    lower

    小写文字字符

    print

    图形或空格字符

    punct

    标点字符

    space

    空格、制表符、新行、和回车

    upper

    大写文字字符

    xdigit

    十六进制数字字符

    它们代表在ctype(3)手册页面中定义的字符类。特定地区可能会提供其他类名。字符类不得用作范围的端点。

    mysql> SELECT 'justalnums' REGEXP '[[:alnum:]]+';       -> 1
    mysql> SELECT '!!' REGEXP '[[:alnum:]]+';               -> 0

    ·         [[:<:]], [[:>:]]

    这些标记表示word边界。它们分别与word的开始和结束匹配。word是一系列字字符,其前面和后面均没有字字符。字字符是alnum类中的字母数字字符或下划线(_)。

    mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]';   -> 1
    mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]';  -> 0

    要想在正则表达式中使用特殊字符的文字实例,应在其前面加上2个反斜杠“/”字符。MySQL解析程序负责解释其中一个,正则表达式库负责解释另一个。例如,要想与包含特殊字符“+”的字符串“1+2”匹配,在下面的正则表达式中,只有最后一个是正确的:

    mysql> SELECT '1+2' REGEXP '1+2';                       -> 0
    mysql> SELECT '1+2' REGEXP '1/+2';                      -> 0
    mysql> SELECT '1+2' REGEXP '1//+2';                     -> 1
     
     
    基本形式:
    属性名 regexp ‘匹配方式’
    属性名表示需要查询的字段的名称;匹配方式表示以哪种方式来进行匹配查询。
    正则表达式模式字符:
    ^: 匹配字符串开始的部分
    $: 匹配字符串结束的部分
    .: 代表字符串中的任意一个字符,包括回车和换行
    [字符集合]: 匹配“字符集合”中的任何一个字符
    [^字符集合]: 匹配出了“字符集合”以外的任何一个字符
    S1|S2|S3: 匹配S1、S2和S3中的任意一个字符串
    *: 代表多个该符号之前的字符,包括0和1个
    +: 代表多个该符号之前的字符,包括1个
    字符串{N}: 字符串出现N次
    字符串{M,N}: 字符串出现至少M次,最多N次
     
     
     电话号码匹配正则表达式:
     
    匹配本地固定电话:
    ^([2-9]{7,8})$
     
    长途手机匹配:
    ^01[3458]([0-9]{9})$
     
    匹配本地手机:
    ^1[3458]([0-9]{9})$
     
    匹配国内长途:
    ^0[1-9]([0-9]{11,12})$
     
    匹配内部分机:
    ^[1-9]{4,5}$
     
    匹配400,800电话:
    ^[48]00([0-9]{7})$
     
     
    Perl正则表达式,匹配操作符,替换操作符修饰符,转换操作符,正则表达式是一个字符串的字符定义视图的模式或多模式

    正则表达式是一个字符串的字符定义视图的模式或多模式。在Perl的正则表达式的语法是什么,你会发现在其他正则表达式,如sedgrepawk的支持程序非常相似。

    运用正则表达式的基本方法是使用结合的经营模式=〜和!〜。第一个是一个测试操作符,第二是一个赋值操作符。


    • 匹配正则表达式 - m//
    • 替代正则表达式 - s///
    • 直译(拼写)正则表达式 - tr///

    在每种情况下斜线作为正则表达式(regex的),你指定的分隔符。如果你喜欢用任何其他分隔符,那么你可以代替使用斜线的位置。

    匹配操作符

    m//匹配操作符,用来匹配一个正则表达式字符串或语句。例如,要匹配的字符序列“foo”对标量$bar,你可能会使用这样的语句:

    if ($bar =~ /foo/)

    m//其实与同样功能的q//操作符。你可以使用任何自然匹配的字符作为分隔符表达式的组合,例如,{},m(),和m><都是有效的。

    如果分隔符是斜杠,你可以从m//省略 成m,但所有其他的分隔符,你必须使用m前缀。

    请注意,整个匹配表达式表现出来。即=〜!或〜匹配操作符左边的表达式,返回true(在标量上下文)如果表达式匹配。因此,语句:

    $true = ($foo =~ m/foo/);

    将会设置$true的值为1 如果$foo匹配正则表达式, 否则$true为0匹配失败。

    匹配在列表上下文中,返回任何分组表达式的内容。例如,从字符串中提取的小时,分钟和秒时,我们可以使用:

    my ($hours, $minutes, $seconds) = ($time =~ m/(d+):(d+):(d+)/);

    匹配运算符修饰符

    匹配的操作符支持其自己的一套修饰符。 /g的修饰符,使全局匹配,/i修饰符将匹配不区分大小写。这里是完整的修饰符列表:

    Modifier	Description i 	Makes the match case insensitivem 	Specifies that if the string has newline or carriage	return characters, the ^ and $ operators will now	match against a newline boundary, instead of a	string boundaryo 	Evaluates the expression only onces 	Allows use of . to match a newline characterx 	Allows you to use white space in the expression for clarityg 	Globally finds all matchescg 	Allows the search to continue even after a global match fails

    只匹配一次

    还有一个简单的版本匹配操作符 - ?Pattern?操作符。这基本上是等同于m//运算符但它仅匹配一次在字符串之间的每个调用reset。

    例如,可以使用此列表内的第一个和最后一个元素:

    #!/usr/bin/perl@list = qw/food foosball subeo footnote terfoot canic footbrdige/;foreach (@list){   $first = $1 if ?(foo.*)?;   $last = $1 if /(foo.*)/;}print "First: $first, Last: $last
    ";# by www.51coolma.cnThis will produce following resultFirst: food, Last: footbrdige

    替换操作符

    替换操作符,s///确实是只是一个扩展,使您可以更换一些新的文本匹配的文本匹配运算符。此运算符基本形式是:

    s/PATTERN/REPLACEMENT/;

    PATTERN 是我们正在寻找的正则表达式的文本。REPLACEMENT 是一个规范,我们要用来替换找到的文字与文本或正则表达式。

    例如,我们可以使用.cat. 替换所有出现的.dog。

    $string =~ s/dog/cat/;

    另外一个例子:

    #/user/bin/perl$string = 'The cat sat on the mat';$string =~ s/cat/dog/;print "Final Result is $string
    ";This will produce following resultThe dog sat on the mat

    替换操作符修饰符

    这里是替代操作符的所有修改的列表:

    Modifier	Description i 	Makes the match case insensitivem 	Specifies that if the string has newline or carriage	return characters, the ^ and $ operators will now	match against a newline boundary, instead of a	string boundaryo 	Evaluates the expression only onces 	Allows use of . to match a newline characterx 	Allows you to use white space in the expression	for clarityg 	Replaces all occurrences of the found expression	with the replacement texte 	Evaluates the replacement as if it were a Perl statement,	and uses its return value as the replacement text

    转换

    转换相似但不完全相同替换的原则,但不像替换转换(翻译)不使用正则表达式搜索替换值。转换操作符是:

    tr/SEARCHLIST/REPLACEMENTLIST/cdsy/SEARCHLIST/REPLACEMENTLIST/cds

    翻译替换在SEARCHLIST与在REPLACEMENTLIST相应出现的字符所有字符。例如,使用“The cat sat on the mat.”字符串我们已经在本章中使用:

    #/user/bin/perl$string = 'The cat sat on the mat';$string =~ tr/a/o/;print "$string
    ";This will produce following resultThe cot sot on the mot.


    也可用于标准的Perl范围,允许你指定字符的范围,由字母或数值。要改变字符串的情况下,您可以使用以下语法在位置的uc函数。


    $string =~ tr/a-z/A-Z/;

    转换操作符

    以下是有关操作符的运算符名单

    Modifier 	Descriptionc 	Complement SEARCHLIST.d 	Delete found but unreplaced characters.s 	Squash duplicate replaced characters.

    / D的修饰符删除匹配SEARCHLIST的字符,不具备相应的条目在REPLACEMENTLIST。例如:

    #!/usr/bin/perl $string = 'the cat sat on the mat.';$string =~ tr/a-z/b/d;print "$string
    ";This will produce following resultb b   b.

    最后的修饰符,/s删除被替换的字符的重复序列,因此:

    #!/usr/bin/perl$string = 'food';$string = 'food';$string =~ tr/a-z/a-z/s;print $string;This will produce following resultfod

    更复杂的正则表达式

    你不只是有固定的字符串匹配。事实上,你可以在任何可以使用更复杂的正则表达式只是匹配。这里有一个快速的小抄:

    Character		Description .              a single characters             a whitespace character (space, tab, newline)S             non-whitespace character # by www.51coolma.cnd             a digit (0-9)D             a non-digitw             a word character (a-z, A-Z, 0-9, _)W             a non-word character[aeiou]        matches a single character in the given set[^aeiou]       matches a single character outside the given set(foo|bar|baz)  matches any of the alternatives specified

    量词可以用来指定有多少以前的东西,你要匹配,其中“thing”是指一个原义字符,上面列出的元字符,或一组括号中的字符或元字符。

    Character            Description *              zero or more of the previous thing+              one or more of the previous thing?              zero or one of the previous thing{3}            matches exactly 3 of the previous thing{3,6}          matches between 3 and 6 of the previous thing{3,}           matches 3 or more of the previous thing

    ^元字符匹配字符串的开头和 $ metasymbol 匹配字符串的结尾。
    这里有一些简单的例子

    # nothing in the string (start and end are adjacent)/^$/   # a three digits, each followed by a whitespace# character (eg "3 4 5 ")/(ds){3}/  # matches a string in which every# odd-numbered letter is a (eg "abacadaf")/(a.)+/  # string starts with one or more digits/^d+/# string that ends with one or more digits/d+$/

    让我们看看另一个例子

    #!/usr/bin/perl$string = "Cats go Catatonic
    When given Catnip";($start) = ($string =~ /A(.*?) /);@lines = $string =~ /^(.*?) /gm;print "First word: $start
    ","Line starts: @lines
    ";This will produce following resultFirst word: CatsLine starts: Cats When

    匹配边界

    匹配任何单词边界,w类和W类之间的区别定义。 因为w一个字的字符,W相反,这通常是指一个词的终止。 B断言不是一个单词边界匹配任何位置。例如:

    /cat/ # Matches 'the cat sat' but not 'cat on the mat'/BcatB/ # Matches 'verification' but not 'the cat on the mat'/catB/ # Matches 'catatonic' but not 'polecat'/Bcat/ # Matches 'polecat' but not 'catatonic'

    选择替代品

    |字符是一样的标准或按位或在Perl。它指定一个正则表达式或组内的备用匹配。例如,以匹配表达式中的“cat”或“dog”,你可能会使用这个:

    if ($string =~ /cat|dog/)

    您可以将单个表达式的元素结合在一起,以支持复杂的匹配。寻找两个人的名字,可以实现两个独立的测试,像这样:

    if (($string =~ /Martin Brown/) ||   ($string =~ /Sharon Brown/))This could be written as followsif ($string =~ /(Martin|Sharon) Brown/)

    分组匹配

    从一个角度的正则表达式看没有区别,也许前者是稍微更清晰。

    $string =~ /(S+)s+(S+)/;and $string =~ /S+s+S+/;

    然而,在分组的好处是,它使我们能够从一个正则表达式提取序列。返回一个列表的顺序,在他们出现在原来的分组。例如,在下面的片段中,我们已经从一个字符串取出小时,分钟和秒。

    my ($hours, $minutes, $seconds) = ($time =~ m/(d+):(d+):(d+)/);

    除了这种直接的方法,也可以在特殊的$x变量,其中x是该组内一些正则表达式匹配组。因此,我们可以重写前面的例子如下:

    $time =~ m/(d+):(d+):(d+)/;my ($hours, $minutes, $seconds) = ($1, $2, $3);

    当组用于替代表达式,$ x的语法,可以用来替换文本。因此,我们可以使用此格式化的日期字符串:

    #!/usr/bin/perl$date = '03/26/1999';$date =~ s#(d+)/(d+)/(d+)#$3/$1/$2#;print "$date";This will produce following result1999/03/26

    使用G断言

    G断言,让您可以继续搜索从最后一个匹配发生的点。

    例如,在下面的代码,我们使用的G,使我们可以搜索到正确的位置,然后提取一些信息,而无需创建一个更复杂的,单一的正则表达式:

    #!/usr/bin/perl$string = "The time is: 12:31:02 on 4/12/00";$string =~ /:s+/g;($time) = ($string =~ /G(d+:d+:d+)/);$string =~ /.+s+/g;($date) = ($string =~ m{G(d+/d+/d+)});print "Time: $time, Date: $date
    ";This will produce following resultTime: 12:31:02, Date: 4/12/00

    G断言,其实只是元符号相当于pos函数,所以正则表达式之间的调用,您可以继续使用pos,甚至修改pos的值(因此 G)的使用pos作为一个lvalue子程序:

    正则表达式中的变量

    正则表达式的变量,包括$,包含匹配无论最后的分组匹配; $&, 其中包含整个匹配的字符串; $`, 其中包含匹配字符串前的一切;  和$', 其中包含匹配的字符串后的一切。

    下面的代码演示的结果:

    #!/usr/bin/perl$string = "The food is in the salad bar";$string =~ m/foo/;print "Before: $`
    ";print "Matched: $&
    ";print "After: $'
    ";# www.51coolma.cnThis code prints the following when executed:Before: TheMatched: fooAfter: d is in the salad bar


    ?  任意单个字符*  任意多个字符<  单词边界>  单词边界[]  多个字符中的一个[-]  一定范围内的任一字符[^x-z]  非{n}  N个重复{n,}  N个或N个以上(greedy!){n,m}  N个到M个@  一个或一个以上(同{1,},从效果来看是non-greedy)

    搜索框支持反向引用:(abc)1 => abcabc

    替换框支持引用匹配pattern的个数最大为9,从1开始:(1)(2)(3)(4)(5)(6)(7)(8)(9) => 123456789

    不支持让我觉得有点郁闷,不过可以将整个串都用括号括起来……但……请见下文

    不支持的模式:

    Nested tagged expressions: ((a)(b)); (不支持嵌套标签)Non-capture groups;  (不支持非捕获组,像(?:pattern)这些)Alternation: a | the;  (不支持“或”)

    以上内容,请选中“查找和替换”对话框中的“使用通配符”进行测试,在非通配符模式下(即不使用“正则”时,不选中“使用通配符”),个人觉得有一个点很值得重视,也许其他正则引擎可以学习一下的:

    替换框可以用^c来引用 剪贴板内容!!

    字符含意

    做为转意,即通常在""后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后//,转意为匹配一个单词的边界。 
    -或- 
    对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,aa,aaa,加了""后,/a*/将只匹配"a*"。

    ^匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a"
    $匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A"
    *匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa
    +匹配前面元字符1次或多次,/ba*/将匹配ba,baa,baaa
    ?匹配前面元字符0次或1次,/ba*/将匹配b,ba
    (x)匹配x保存x在名为$1...$9的变量中
    x|y匹配x或y
    {n}精确匹配n次
    {n,}匹配n次以上
    {n,m}匹配n-m次
    [xyz]字符集(character set),匹配这个集合中的任一一个字符(或元字符)
    [^xyz]不匹配这个集合中的任何一个字符
    []匹配一个退格符
    匹配一个单词的边界
    B匹配一个单词的非边界
    cX这儿,X是一个控制符,/cM/匹配Ctrl-M
    d匹配一个字数字符,/d/ = /[0-9]/
    D匹配一个非字数字符,/D/ = /[^0-9]/
    匹配一个换行符
    匹配一个回车符
    s匹配一个空白字符,包括 , ,f, ,v等
    S匹配一个非空白字符,等于/[^ f v]/
    匹配一个制表符
    v匹配一个重直制表符
    w匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[w]匹配"$5.98"中的5,等于[a-zA-Z0-9]
    W匹配一个不可以组成单词的字符,如[W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。

    用re = new RegExp("pattern",["flags"]) 的方式比较好 
    pattern : 正则表达式 
    flags: g (全文查找出现的所有 pattern) 
    i (忽略大小写) 
    m (多行查找)

    vaScript动态正则表达式问题

    请问正则表达式可以动态生成吗? 
    例如JavaScript中: 
    var str = "strTemp"; 
    要生成: 
    var re = /strTemp/; 
    如果是字符连接: 
    var re = "/" + str + "/"即可 
    但是要生成表达式,可以实现吗?怎样实现?

     
       
       


    数字:^[0-9]*$n位的数字:^d{n}$至少n位的数字:^d{n,}$m-n位的数字:^d{m,n}$零和非零开头的数字:^(0|[1-9][0-9]*)$非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$带1-2位小数的正数或负数:^(-)?d+(.d{1,2})?$正数、负数、和小数:^(-|+)?d+(.d+)?$有两位小数的正实数:^[0-9]+(.[0-9]{2})?$有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$非零的正整数:^[1-9]d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^+?[1-9][0-9]*$非零的负整数:^-[1-9][]0-9"*$ 或 ^-[1-9]d*$非负整数:^d+$ 或 ^[1-9]d*|0$非正整数:^-[1-9]d*|0$ 或 ^((-d+)|(0+))$非负浮点数:^d+(.d+)?$ 或 ^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$非正浮点数:^((-d+(.d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$正浮点数:^[1-9]d*.d*|0.d*[1-9]d*$ 或 ^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$负浮点数:^-([1-9]d*.d*|0.d*[1-9]d*)$ 或 ^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$浮点数:^(-?d+)(.d+)?$ 或 ^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$

    正则表达式在线生成工具: https://www.51coolma.cn/tools/index?name=create_reg


    本教程为你讲一下关于正则表达式匹配空格方法与代码实例哦,看看这几种匹配空格的有效方法吧。
    regex.replace (line , @"s+" , ",");//转换空格为“,”s匹配任意的空白符,包括空格,制表符(tab),换行符,中文全角空格s 空白字符:[ ] //这个是重点!制表符 ('u0009') 新行(换行)符 ('u000a') 回车符 ('u000d') 换页符 ('u000c')  报警 (bell) 符 ('u0007') e 转义符 ('u001b') cx 对应于 x 的控制符


    实例一
    explode是用字符串打散字符串
    split才是用正则打散字符串

    $str = "123 456";$patten = "/s+/";$result = split($patten,$str);echo join("<br>",$result);

    正则表达式在线生成工具: https://www.51coolma.cn/tools/index?name=create_reg



    正则表达式非常有用,查找、匹配、处理字符串、替换和转换字符串,输入输出等。而且各种语言都支持,例如.NET正则库,JDK正则包, Perl, JavaScript等各种脚本语言都支持正则表达式。下面整理一些常用的正则表达式。

    字符

    描述

    将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。' ' 匹配一个换行符。序列 '' 匹配 "" 而 "(" 则匹配 "("。
    ^匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ' ' 或 ' ' 之后的位置。
    $匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ' ' 或 ' ' 之前的位置。
    *匹配前面的子表达式零次或多次。例如,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}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
    ?当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
    .匹配除 " " 之外的任何单个字符。要匹配包括 ' ' 在内的任何字符,请使用象 '[. ]' 的模式。
    (pattern)匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0$9 属性。要匹配圆括号字符,请使用 '(' 或 ')'。
    (?:pattern)匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
    (?=pattern)正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
    (?!pattern)负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "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' 范围内的任意字符。
     匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
    B匹配非单词边界。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
    cx匹配由 指明的控制字符。例如, cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
    d匹配一个数字字符。等价于 [0-9]。
    D匹配一个非数字字符。等价于 [^0-9]。
    f匹配一个换页符。等价于 x0c 和 cL。
    匹配一个换行符。等价于 x0a 和 cJ。
    匹配一个回车符。等价于 x0d 和 cM。
    s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ f v]。
    S

    匹配任何非空白字符。等价于 [^ f v]。

    匹配一个制表符。等价于 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 为一个后跟文字 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 nm 将匹配八进制转义值 nm
    nml如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
    /i使正则表达式对大小写不敏感, (?-i)是关闭大小写不敏感
    (?i)te(?-i)st应该匹配TEst,但是不能匹配teST或TEST.
    /s开启“单行模式”,即点号“.”匹配新行符
    /m开启“多行模式”,即“^”和“$”匹配新行符的前面和后面的位置。
    ^[0-9]*$只能输入数字
    ^d{n}$只能输入n位的数字
    ^d{n,}$只能输入至少n位的数字
    ^d{m,n}$只能输入m~n位的数字
    ^(0|[1-9][0-9]*)$只能输入零和非零开头的数字
    ^[0-9]+(.[0-9]{2})?$只能输入有两位小数的正实数
    ^[0-9]+(.[0-9]{1,3})?$只能输入有1~3位小数的正实数
    ^+?[1-9][0-9]*$只能输入非零的正整数
    ^-[1-9][]0-9"*$只能输入非零的负整数
    ^.{3}$只能输入长度为3的字符
    ^[A-Za-z]+$只能输入由26个英文字母组成的字符串
    ^[A-Za-z0-9]+$只能输入由数字和26个英文字母组成的字符串
    ^w+$只能输入由数字、26个英文字母或者下划线组成的字符串
    ^[a-zA-Z]w{5,17}$验证用户密码:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
    [^%&',;=?$x22]+验证是否含有^%&',;=?$"等字符
    ^[u4e00-u9fa5]{0,}$只能输入汉字
    ^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$验证Email地址
    ^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$验证InternetURL
    ^d{15}|d{18}$验证身份证号(15位或18位数字)
    ^((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)$验证IP地址
    (w)1匹配两个两个重叠出现的字符

    例如,"aabbc11asd", 返回结果为aa bb 11三组match

    <(?[^s>]+)[^>]*>.*>匹配成对的HTML标签
    (?!)不出现,负声明
    下例演示如何取得一个标签对中的全部内容,即使其中包含别的HTML tag。 

    string newsContent = @"url:test Regex."; Regex regEnd = new Regex(@"<s*a[^>]*>([^<]|<(?!/a))*<s*/as*>",RegexOptions.Multiline); 

     

    1. 匹配组

    常用的组匹配:(实用)

    (exp)

    匹配exp并且捕获到一个自动命名的组

    (?<name>exp)

    匹配exp并且捕获到组’name’
    (?=exp)exp出现在声明右侧,但exp不作为匹配括号中的模式必须出现在声明右侧,但不作为匹配的一部分 ,例如:输入: public keywod string "abc"; 正则:w+(?=ing),返回“str”,意思为:匹配以ing结束的单词,但ing不作为返回
    (?<=exp)exp出现在声明左侧,但exp不作为匹配括号中的模式必须出现在声明左侧,但不作为匹配的一部分 ,例如:输入: public remember string "abc"; 正则:(?<=re)w+,返回“member”,意思为:匹配以re开头的单词,但re不作为返回

    (?!exp)

     

    exp不出现在声明右侧,但exp不作为匹配括号中的模式必须不出现在声明右侧 ,例如:输入: remember aqa bqu "abc"; 正则:w*q(?!u)w*,返回“aqa”,意思为:匹配带q后面不是跟随u的单词

    (?exp)

    exp不出现在声明左侧,但exp不作为匹配

     

    输入public string keywod = "abc"; string value = "test";

    目的:匹配 关键字="",例如获得关键字keyword,value;获得等于的值abc和test

    表达式string (?[^=]*?) *= *(?[^;]*?);

    代码

    private void ParseKeywords(string input){ System.Text.RegularExpressions.MatchCollection mc =  System.Text.RegularExpressions.Regex.Matches(input, @"string (?[^=]*?) *= *(?[^;]*?);");  if (mc != null && mc.Count > 0) { foreach (System.Text.RegularExpressions.Match m in mc) { string keyword = m.Groups["x"].Value; string value = m.Groups["y"].Value; } }}


    截图

    1 

    2. 匹配并替换

    输入public <%=classname%>Extension : IExt

    目的:匹配 <%= %>中间的classname并替换

    表达式:<%=.*%>

    代码

    private string Replace(string input){ return Regex.Replace(input, @"<%=.*%>", new MatchEvaluator(RefineCodeTag), RegexOptions.Singleline);} string RefineCodeTag(Match m){ string x = m.ToString();  x = Regex.Replace(x, "<%=", ""); x = Regex.Replace(x, "%>", "");  return x.Trim() + ",";}

    截图:

    2 

    正则表达式选项RegexOptions:

    ExplicitCapture

    n

    只有定义了命名或编号的组才捕获

    IgnoreCasei不区分大小写
    IgnorePatternWhitespacex消除模式中的非转义空白并启用由 # 标记的注释。
    MultiLinem

    多行模式,其原理是修改了^和$的含义

    SingleLines

    单行模式,和MultiLine相对应

    正则表达式替换的其他功能:

    $number把匹配的第number组替换成替换表达式

    这段代码返回的是 “01 012 03 05”

    就是说,对组一的每个匹配结果都用"0$1"这个表达式来替换,"0$1"中"$1"由组1匹配的结果代入


    public static void Main(){  string s = "1 12 3 5"; s = Regex.Replace(s,@"(d+)(?#这个是注释)","0$1",RegexOptions.Compiled|RegexOptions.IgnoreCase); Console.WriteLine(s); Console.ReadLine(); }

    ${name}

    把匹配的组名为"name"的组替换成表达式,

    上例的Regex expression改成@"(?d+)(?#这个是注释)"后面的替换式改为"0${name}"结果是一样的

    $$

    做$的转义符,如上例表达式改成@"(?d+)(?#这个是注释)"和"$$${name}",则结果为"$1 $12 $3 $5"

    $&替换整个匹配
    $`替换匹配前的字符
    $'替换匹配后的字符
    $+替换最后匹配的组
    $_替换整个字符串

     

    3. 匹配URL中文件名

    输入http://www.51coolma.cn

    目的:从URL地址中提取文件名

    表达式s=s.replace(/(.*/){0,}([^.]+).*/ig,"$2") ;

    代码

    string s = "http://www.51coolma.cn";
    s = s.replace(/(.*/){0,}([^.]+).*/ig, "$2") ;
     


    注:元字符包括 | ( ) [ ] { } ^ $ * + ? . )

    • 匹配中文字符的正则表达式: [u4e00-u9fa5]
      评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
    • 匹配双字节字符(包括汉字在内):[^x00-xff]
      评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
    • 匹配空白行的正则表达式: s*
      评注:可以用来删除空白行
    • 匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?</>|<.*? />
      评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
    • 匹配首尾空白字符的正则表达式:^s*|s*$
      评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
    • 匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
      评注:表单验证时很实用
    • 匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
      评注:网上流传的版本功能很有限,上面这个基本可以满足需求
    • 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]$
      评注:表单验证时很实用
    • 匹配国内电话号码:d-d|d-d
      评注:匹配形式如 0511-4405222 或 021-87888822
    • 匹配腾讯QQ号:[1-9][0-9]
      评注:腾讯QQ号从10000开始
    • 匹配中国邮政编码:[1-9]d(?!d)
      评注:中国邮政编码为6位数字
    • 匹配身份证:d|d
      评注:中国的身份证为15位或18位
    • 匹配ip地址:d+.d+.d+.d+
      评注:提取ip地址时有用
    • 匹配特定数字:
      ^[1-9]d*$    //匹配正整数
      ^-[1-9]d*$   //匹配负整数
      ^-?[1-9]d*$   //匹配整数
      ^[1-9]d*|0$  //匹配非负整数(正整数 + 0)
      ^-[1-9]d*|0$   //匹配非正整数(负整数 + 0)
      ^[1-9]d*.d*|0.d*[1-9]d*$   //匹配正浮点数
      ^-([1-9]d*.d*|0.d*[1-9]d*)$  //匹配负浮点数
      ^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$  //匹配浮点数
      ^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$   //匹配非负浮点数(正浮点数 + 0)
      ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$  //匹配非正浮点数(负浮点数 + 0)
      评注:处理大量数据时有用,具体应用时注意修正
    • 匹配特定字符串:
      ^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
      ^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
      ^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
      ^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
      ^w+$  //匹配由数字、26个英文字母或者下划线组成的字符串
      评注:最基本也是最常用的一些表达式

    今天在Java中想使用正则表达式来获取一段文本中的任意字符。于是很随意得就写出如下匹配规则:

    (.*)

    结果运行之后才发现,无法获得换行之后的文本。于是查了一下手册,才发现正则表达式中,“.”(点符号)匹配的是除了换行符“ ”以外的所有字符。同时, 手册上还有一句话:要匹配包括 ‘ ’ 在内的任何字符,请使用像 ‘[. ]’ 的模式。于是我将正则表达式的匹配规则修改如下:

    ([.
    ]*)

    当然,如果是在java程序中直接写到话,需要改为([. ]*)

    结果再次运行程序,发现什么内容也取不到了。我百思不得其解,又将其修改为如下规则:

    ([.|
    ]*) 以及 ([
    .]*)

    结果还是不行,什么内容都取不到。看来点符号和换行符卯上劲了~
    然后上网一查,虽然没有查出上述规则到底是什么地方出问题了,但是查出了一个解决办法,经过一试,果然可以匹配包括换行符在内的任意字符,以下为正确的正则表达式匹配规则:

    ([sS]*)

    同时,也可以用 “([dD]*)”、“([wW]*)” 来表示。

    正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。

    举例来说,正则表达式的一个最为普遍的应用就是用于验证用户在线输入的邮件地址的格式是否正确。如果通过正则表达式验证用户邮件地址的格式正确,用户所填写的表单信息将会被正常处理;反之,如果用户输入的邮件地址与正则表达的模式不匹配,将会弹出提示信息,要求用户重新输入正确的邮件地址。由此可见正则表达式在WEB应用的逻辑判断中具有举足轻重的作用。

    基本语法在对正则表达式的功能和作用有了初步的了解之后,我们就来具体看一下正则表达式的语法格式。正则表达式的形式一般如下:

    /love/

    其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

    较为常用的元字符包括:   “+”,   “*”,以及   “?”。其中,“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次,“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次,而“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。
    下面,就让我们来看一下正则表达式元字符的具体应用。

    /fo+/

    因为上述正则表达式中包含“+”元字符,表示可以与目标对象中的   “fool”,   “fo”,   或者   “football”等在字母f后面连续出现一个或多个字母o的字符串相匹配。

    /eg*/

    因为上述正则表达式中包含“*”元字符,表示可以与目标对象中的   “easy”,   “ego”,   或者   “egg”等在字母e后面连续出现零个或多个字母g的字符串相匹配。

    /Wil?/

    因为上述正则表达式中包含“?”元字符,表示可以与目标对象中的   “Win”,   或者   “Wilson”,等在字母i后面连续出现零个或一个字母l的字符串相匹配。

    除了元字符之外,用户还可以精确指定模式在匹配对象中出现的频率。例如,

    /jim{2,6}/

    上述正则表达式规定字符m可以在匹配对象中连续出现2-6次,因此,上述正则表达式可以同jimmy或jimmmmmy等字符串相匹配。
    在对如何使用正则表达式有了初步了解之后,我们来看一下

    其它几个重要的元字符的使用方式。
    s:用于匹配单个空格符,包括tab键和换行符;
    S:用于匹配除单个空格符之外的所有字符;
    d:用于匹配从0到9的数字;
    w:用于匹配字母,数字或下划线字符;
    W:用于匹配所有与w不匹配的字符;
    .   :用于匹配除换行符之外的所有字符。
    (说明:我们可以把s和S以及w和W看作互为逆运算)

    下面,我们就通过实例看一下如何在正则表达式中使用上述元字符。
    /s+/     上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。
    /d000/     如果我们手中有一份复杂的财务报表,那么我们可以通过上述正则表达式轻而易举的查找到所有总额达千元的款项。
    除了我们以上所介绍的元字符之外,正则表达式中还具有另外一种较为独特的专用字符,即定位符。定位符用于规定匹配模式在目标对象中的出现位置。

    较为常用的定位符包括:   “^”,   “$”,   “”   以及   “B”。

    其中,“^”定位符规定匹配模式必须出现在目标字符串的开头,“$”定位符规定匹配模式必须出现在目标对象的结尾,定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一,而“B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。同样,我们也可以把“^”和“$”以及“”和“B”看作是互为逆运算的两组定位符。举例来说:

    /^hell/     因为上述正则表达式中包含“^”定位符,所以可以与目标对象中以   “hell”,   “hello”或   “hellhound”开头的字符串相匹配。
    /ar$/     因为上述正则表达式中包含“$”定位符,所以可以与目标对象中以   “car”,   “bar”或   “ar”   结尾的字符串相匹配。
    /bom/     因为上述正则表达式模式以“”定位符开头,所以可以与目标对象中以   “bomb”,   或   “bom”开头的字符串相匹配。
    /man/     因为上述正则表达式模式以“”定位符结尾,所以可以与目标对象中以   “human”,   “woman”或   “man”结尾的字符串相匹配。

    为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。

    例如:

    /[A-Z]/     上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。
    /[a-z]/     上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。
    /[0-9]/     上述正则表达式将会与从0到9范围内任何一个数字相匹配。
    /([a-z][A-Z][0-9])+/     上述正则表达式将会与任何由字母和数字组成的字符串,如   “aB0”   等相匹配。

    这里需要提醒用户注意的一点就是可以在正则表达式中使用   “()”   把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如   “abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。

    如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符   “|”。例如:

    /to|too|2/     上述正则表达式将会与目标对象中的   “to”,   “too”,   或   “2”   相匹配。

    正则表达式中还有一个较为常用的运算符,即否定符   “[^]”。与我们前文所介绍的定位符   “^”   不同,否定符   “[^]”规定目标对象中不能存在模式中所规定的字符串。例如:

    /[^A-C]/     上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。一般来说,当“^”出现在   “[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。     最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义符“”。例如:

    /Th*/     上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。使用实例     在对正则表达式有了较为全面的了解之后,我们就来看一下如何在Perl,PHP,以及javascript中使用正则表达式。

    通常,Perl中正则表达式的使用格式如下:

    operator   /   regular-expression   /   string-to-replace   /   modifiers

    运算符一项可以是m或s,分别代表匹配运算和替换运算。其中,正则表达式一项是将要进行匹配或替换操作的模式,可以由任意字符,元字符,或定位符等组成。替换字符串一项是使用s运算符时,对查找到的模式匹配对象进行替换的字符串。

    最后的参数项用来控制不同的匹配或替换方式。例如:

    s/geed/good/

    将会在目标对象中查找第一个出现的geed字串,并将其替换为good。如果我们希望在目标对象的全局范围内执行多次查找—   替换操作的话,可以使用参数   “g”,即s/love/lust/g。

    此外,如果我们不需要限制匹配的大小写形式的话,可以使 用参数   “i   ”。例如,m/JewEL/i     上述正则表达式将会与目标对象中的jewel,Jewel,或JEWE L相匹配。

    在Perl中,使用专门的运算符“=~”指定正则表达式的匹配  对象。例如:     $flag   =~   s/abc/ABC/上述正则表达式将会把变量$flag中的字串abc替换为ABC

    本文主要是对匹配中文汉字的正则表达式的介绍,本文同时讲解了匹配中文字符的正则和匹配双字节字符的正则,需要的朋友可以参考下

    w 匹配的仅仅是中文,数字,字母,对于国人来讲,仅匹配中文时常会用到,见下

    代码如下:
    匹配中文字符的正则表达式: [u4e00-u9fa5]



    或许你也需要匹配双字节字符,中文也是双字节的字符
    代码如下:
    匹配双字节字符(包括汉字在内):[^x00-xff]


    注:可以用来计算字符串的长度(一个双字节字符长度计 2,ASCII 字符计 1 )



    PS:关于正则,本站还提供了一个非常简便实用的正则测试工具供大家使用:

    正则表达式在线测试工具://www.51coolma.cn/tools/index?name=reg

    在线正则表达式测试

    //www.51coolma.cn/tools/index?name=reg




    常用正则表达式

  • 匹配中文字符
  • 匹配双字节字符(包括汉字在内)
  • 匹配空白行
  • 匹配Email地址
  • 匹配网址URL
  • 匹配国内电话号码
  • 匹配腾讯QQ号
  • 匹配中国邮政编码
  • 匹配18位身份证号
  • 匹配(年-月-日)格式日期
  • 匹配正整数
  • 匹配负整数
  • 匹配整数
  • 匹配非负整数(正整数 + 0)
  • 匹配非正整数(负整数 + 0)
  • 匹配正浮点数
  • 匹配负浮点数




  • 各式各样的正则表达式参考大全: 

    ^d+$  //匹配非负整数(正整数 + 0)  //匹配整数 ^d+(.d+)?$  //匹配非负浮点数(正浮点数 + 0) ^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$  //匹配正浮点数 ^((-d+(.d+)?)|(0+(.0+)?))$  //匹配非正浮点数(负浮点数 + 0) ^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$  //匹配负浮点数 ^(-?d+)(.d+)?$  //匹配浮点数 ^[A-Za-z]+$????????? //匹配由26个英文字母组成的字符串 ^[A-Z]+$ ??? //匹配由26个英文字母的大写组成的字符串 ^[a-z]+$  //匹配由26个英文字母的小写组成的字符串 ^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串 ^w+$  //匹配由数字、26个英文字母或者下划线组成的字符串 ^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$    //匹配email地址 ^[a-zA-z]+://匹配(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$  //匹配url 匹配中文字符的正则表达式: [u4e00-u9fa5] 匹配双字节字符(包括汉字在内):[^x00-xff] 匹配空行的正则表达式:
    [s| ]*
     匹配HTML标记的正则表达式:/<(.*)>.*</>|<(.*) />/ 匹配首尾空格的正则表达式:(^s*)|(s*$) 匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 匹配网址URL的正则表达式:^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$ 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 匹配国内电话号码:(d{3}-|d{4}-)?(d{8}|d{7})? 匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$ 



    下表是元字符及其在正则表达式上下文中的行为的一个完整列表,具体到每个正则表达式符号: 
     将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。 ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 ’
    ’ 或 ’
    ’ 之后的位置。 $ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性,$ 也匹配 ’
    ’ 或 ’
    ’ 之前的位置。 * 匹配前面的子表达式零次或多次。 + 匹配前面的子表达式一次或多次。+ 等价于 {1,}。 ? 匹配前面的子表达式零次或一次。? 等价于 {0,1}。 {n} n 是一个非负整数,匹配确定的n 次。 {n,} n 是一个非负整数,至少匹配n 次。 {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。 ? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。 . 匹配除 "
    " 之外的任何单个字符。要匹配包括 ’
    ’ 在内的任何字符,请使用象 ’[.
    ]’ 的模式。 (pattern) 匹配pattern 并获取这一匹配。 (?:pattern) 匹配pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。 (?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。 (?!pattern) 负向预查,与(?=pattern)作用相反 x|y 匹配 x 或 y。 [xyz] 字符集合。 [^xyz] 负值字符集合。 [a-z] 字符范围,匹配指定范围内的任意字符。[^a-z] 负值字符范围,匹配任何不在指定范围内的任意字符。  匹配一个单词边界,也就是指单词和空格间的位置。 B 匹配非单词边界。 cx 匹配由x指明的控制字符。 d 匹配一个数字字符。等价于 [0-9]。 D 匹配一个非数字字符。等价于 [^0-9]。? f 匹配一个换页符。等价于 x0c 和 cL。 
     匹配一个换行符。等价于 x0a 和 cJ。 
     匹配一个回车符。等价于 x0d 和 cM。 s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ f
    
    	v]。 S 匹配任何非空白字符。等价于 [^ f
    
    	v]。 	 匹配一个制表符。等价于 x09 和 cI。v 匹配一个垂直制表符。等价于 x0b 和 cK。 w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。W 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。 
    um 匹配 num,其中num是一个正整数。对所获取的匹配的引用。 
     标识一个八进制转义值或一个后向引用。如果 
     之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。 
    m 标识一个八进制转义值或一个后向引用。如果 
    m 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 
    m 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 
    m 将匹配八进制转义值 nm。 
    ml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八.


    正则表达式 (regex) 的快速参考,包括符号、范围、分组、断言和一些帮助您入门的示例模式。

    开始

    字符类

    [abc]单个字符:a、b 或 c
    [^abc]一个字符,除了:a、b 或 c
    [a-z]范围内的一个字符:az
    [^a-z]不在范围内的字符:az
    [0-9]范围内的数字:0-9
    [a-zA-Z]范围内的一个字符:
    az 或 AZ
    [a-zA-Z0-9]范围内的一个字符:
    az、AZ 或 0-9

    量词

    a?零个或一个
    a*零个或多个
    a+一个或多个
    [0-9]+0-9 中的一项或多项
    a{3}正好 3 个
    a{3,}3个或更多
    a{3,6}介于 3 和 6 之间
    a*贪婪量词
    a*?惰性量词
    a*+所有格量词

    常见元字符

    • ^
    • {
    • +
    • <
    • [
    • *
    • )
    • >
    • .
    • (
    • |
    • $
    • ?

    转义这些特殊字符

    元序列

    .任意单个字符
    s任何空白字符
    S任何非空白字符
    d任意数字,同[0-9]
    D任何非数字,同[^0-9]
    w任何单词字符
    W任何非单词字符
    X任何 Unicode 序列,包括换行符
    C匹配一个数据单元
    RUnicode 换行符
    v垂直空白字符
    Vv 的否定 - 除了换行符和垂直制表符之外的任何东西
    h水平空白字符
    Hh 的否定
    K重置匹配
    匹配第 n 个子模式
    pXUnicode 属性 X
    p{...}Unicode 属性或脚本类别
    PXpX 的否定
    P{...}p 的否定
    Q...E引用; 视为文字
    k<name>匹配子模式 name
    k'name'匹配子模式 name
    k{name}匹配子模式 name
    gn匹配第 n 个子模式
    g{n}匹配第 n 个子模式
    g<n>递归第 n 个捕获组
    g'n'递归第 n 个捕获组。
    g{-n}匹配第 n 个相对前一个子模式
    g<+n>递归第 n 个相对即将到来的子模式
    g'+n'匹配第 n 个相对即将到来的子模式
    g'letter'递归命名捕获组 letter
    g{letter}匹配先前命名的捕获组 letter
    g<letter>递归命名捕获组 letter
    xYY十六进制 YY
    x{YYYY}十六进制字符 YYYY
    ddd八进制字符ddd
    cY控制字符 Y
    []退格字符
    使任何字符文字

    G比赛开始
    ^字符串的开始
    $字符串结束
    A字符串的开始
    字符串结束
    z字符串的绝对结尾
    一个词的边界
    B非词边界

    替换

    完整的比赛内容
    1捕获组 1 中的内容
    $1捕获组 1 中的内容
    ${foo}捕获组中的内容 foo
    x20十六进制替换值
    x{06fa}十六进制替换值
    标签
    回车
    新队
    f换页
    U大写转换
    L小写转换
    E终止任何转换

    组构造

    (...)捕获所有封闭的东西
    (a|b)匹配 a 或 b
    (?:...)匹配包含的所有内容
    (?>...)原子组(非捕获)
    (?|...)重复的子模式组号
    (?#...)评论
    (?'name'...)命名捕获组
    (?<name>...)命名捕获组
    (?P<name>...)命名捕获组
    (?imsxXU)内联修饰符
    (?(DEFINE)...)在使用之前预定义模式

    断言

    (?(1)yes|no)条件语句
    (?(R)yes|no)条件语句
    (?(R#)yes|no)递归条件语句
    (?(R&name)yes|no)条件语句
    (?(?=...)yes|no)有条件的前瞻
    (?(?<=...)yes|no)后视条件

    环视

    (?=...)正向预测
    (?!...)负前瞻
    (?<=...)正面回顾
    (?<!...)负面回顾

    Lookaround 允许您在主模式之前 (lookbehind) 或之后 (lookahead) 匹配一个组,而不将其包含在结果中。

    标志/修饰符

    g全球的
    m多线
    i不区分大小写
    x忽略空格
    s单线
    u统一码
    X扩展
    U不贪心
    A
    J重复的组名
    递归
    (?R)递归整个模式
    (?1)递归第一个子模式
    (?+1)递归第一个相对子模式
    (?&name)递归子模式 name
    (?P=name)匹配子模式 name
    (?P>name)递归子模式 name

    POSIX 字符类

    [[:alnum:]][0-9A-Za-z]字母和数字
    [[:alpha:]][A-Za-z]信件
    [[:ascii:]][x00-x7F]ASCII 码 0-127
    [[:blank:]][ ]仅空格或制表符
    [[:cntrl:]][x00-x1Fx7F]控制字符
    [[:digit:]][0-9]十进制数字
    [[:graph:]][[:alnum:][:punct:]]可见字符(不是空格)
    [[:lower:]][a-z]小写字母
    [[:print:]][ -~] == [ [:graph:]]可见字符
    [[:punct:]][!"#$%&’()*+,-./:;<=>?@[]^_`{|}~]可见标点符号
    [[:space:]][ vf ]空白
    [[:upper:]][A-Z]大写字母
    [[:word:]][0-9A-Za-z_]文字字符
    [[:xdigit:]][0-9A-Fa-f]十六进制数字
    [[:<:]][(?=w)]词的开头
    [[:>:]][(?<=w)]词尾

    控制动词

    (*ACCEPT)控制动词
    (*FAIL)控制动词
    (*MARK:NAME)控制动词
    (*COMMIT)控制动词
    (*PRUNE)控制动词
    (*SKIP)控制动词
    (*THEN)控制动词
    (*UTF)图案修饰符
    (*UTF8)图案修饰符
    (*UTF16)图案修饰符
    (*UTF32)图案修饰符
    (*UCP)图案修饰符
    (*CR)换行修饰符
    (*LF)换行修饰符
    (*CRLF)换行修饰符
    (*ANYCRLF)换行修饰符
    (*ANY)换行修饰符
    R换行修饰符
    (*BSR_ANYCRLF)换行修饰符
    (*BSR_UNICODE)换行修饰符
    (*LIMIT_MATCH=x)正则表达式引擎修饰符
    (*LIMIT_RECURSION=d)正则表达式引擎修饰符
    (*NO_AUTO_POSSESS)正则表达式引擎修饰符
    (*NO_START_OPT)正则表达式引擎修饰符

    正则表达式示例

    字符匹配

    ring匹配 ring springboard
    .匹配  a9+ 等等。
    h.o匹配 hooh2oh/o 等等。
    ring?匹配 ring?
    (quiet)匹配 (quiet)
    c:windows匹配   c:windows

    使用搜索这些特殊字符:
    [ ^ $ . | ? * + ( ) { }

    可替代方案

    cat|dog匹配 cat 或者 dog
    id|identity匹配 id  或者 identity
    identity|id匹配 id  或者 identity

    当备选方案重叠时,从长到短排序

    字符块匹配

    [aeiou]匹配任何元音
    [^aeiou]匹配一个非元音
    r[iau]ng匹配 ring, wrangle, sprung, 等等。
    gr[ae]y匹配 gray  或者 
    [a-zA-Z0-9]匹配任何字母或数字

    [ ]总是逃避. ]有时^ - .

    特殊字符匹配

    w “单词”字符
    (字母、数字或下划线)
    d 数字
    s 空格
    (空格、制表符、vtab、换行符)
    W, D, or S 不是单词、数字或空格
    [DS] 表示不是数字或空格,两者都匹配
    [^ds] 禁止数字和空格

    事件匹配

    colou?r匹配 color 或者 colour
    [BW]ill[ieamy's]*匹配 Bill, Willy, William's  等等。
    [a-zA-Z]+匹配 1 个或多个字母
    d{3}-d{2}-d{4}匹配 SSN
    [a-z]w{1,7}匹配 UW NetID

    贪婪匹配和懒惰匹配

    * + {n,}
    贪婪的
    尽可能匹配
    <.+> 找到 1 个大匹配 <b>粗体</b>
    *? +? {n,}?
    懒惰的
    尽量少搭配
    <.+?>在 < 中找到 2 个匹配项>粗体</b>

    匹配范围

     "单词”边缘(在非“单词”字符旁边)
    ring 单词以“ring”开头,例如 铃声
    ring 单词以“ring”结尾,例如 春天
    9 匹配单个数字 9,而不是 19、91、99 等。
    [a-zA-Z]{6} 匹配 6 个字母的单词
    B 不是字边
    BringB 匹配 springs 和 wringer
    ^d*$ 整个字符串必须是数字
    ^[a-zA-Z]{4,20}$字符串必须有 4-20 个字母
    ^[A-Z] 字符串必须以大写字母开头
    [.!?"')]$ 字符串必须以终结符结尾

    修饰匹配

    (?i)​[a-z]*​(?-i)忽略大小写 ON / OFF
    (?s).*(?-s)匹配多行(导致 . 匹配换行符)
    (?m)^.*;$(?-m)^ & $ 匹配行而不是整个字符串
    (?x)#free-spacing 模式,此 EOL 注释被忽略
    (?-x)自由空间模式关闭
    /regex/ismx整个字符串的修改模式

    组匹配

    (in|out)put 匹配 input 或者 output
    d{5}(-d{4})?美国邮政编码(“+4”可选)

    如果组后匹配失败,解析器会尝试每个替代方案。
    可能导致灾难性的回溯。

    反向引用

    (to) (be) or not 1 2匹配 生存还是毁灭
    ([^s])1{2}匹配非空格,然后再重复两次   aaa, ...
    (w+)s+1匹配双字

    非捕获组

    on(?:click|load)比...快:
    on(click|load)

    尽可能使用非捕获或原子组

    原子组

    (?>red|green|blue)比非捕获更快
    (?>id|identity)匹配 id, 但不是 identity

    “id”匹配,但在原子组之后失败,解析器不会回溯到组以重试“身份”
    如果替代品重叠,则从长到短排序。

    周围匹配

    (?= )向前看,如果你能提前找到
    (?! )向前看,如果你不能提前找到
    (?<= )回头看,如果你能找到后面
    (?<! )回头看,如果你找不到后面
    w+?(?=ing)匹配 warbling, string, fishing,...
    (?!w+ing)w+不以“ing”结尾的单词
    (?<=pre).*? 匹配 pretend,present,prefix,...
    w{3}(?<!pre)w*?不以“pre”开头的单词
    w+(?<!ing)匹配不以“ing”结尾的单词

    If-then-else

    匹配 "Mr." 或者 "Ms."  如果单词“her”在字符串后面

    M(?(?=.*?her)s|r).

    需要环视 ​if​ 条件

    Python 中的正则表达式

    入门

    导入正则表达式模块

    import re

    例子

    re.search()

    >>> sentence = 'This is a sample string'>>> bool(re.search(r'this', sentence, flags=re.I))True>>> bool(re.search(r'xyz', sentence))False

    re.findall()

    >>> re.findall(r's?pare?', 'par spar apparent spare part pare')['par', 'spar', 'spare', 'pare']>>> re.findall(r'0*[1-9]d{2,}', '0501 035 154 12 26 98234')['0501', '154', '98234']

    re.finditer()

    >>> m_iter = re.finditer(r'[0-9]+', '45 349 651 593 4 204')>>> [m[0] for m in m_iter if int(m[0]) < 350]['45', '349', '4', '204']

    re.split()

    >>> re.split(r'd+', 'Sample123string42with777numbers')['Sample', 'string', 'with', 'numbers']

    re.sub()

    >>> ip_lines = "catapults
    concatenate
    cat">>> print(re.sub(r'^', r'* ', ip_lines, flags=re.M))* catapults* concatenate* cat

    重新编译()

    >>> pet = re.compile(r'dog')>>> type(pet)<class '_sre.SRE_Pattern'>>>> bool(pet.search('They bought a dog'))True>>> bool(pet.search('A cat crossed their path'))False

    方法

    re.findall返回包含所有匹配项的列表
    re.finditer返回一个可迭代的匹配对象(每个匹配一个)
    re.search如果字符串中的任何位置都匹配,则返回一个 Match 对象
    re.split返回一个列表,其中字符串在每次匹配时被拆分
    re.sub用字符串替换一个或多个匹配项
    re.compile编译正则表达式模式以备后用
    re.escape返回所有非字母数字反斜杠的字符串

    Flags

    re.Ire.IGNORECASE忽略大小写
    re.Mre.MULTILINE多线
    re.Lre.LOCALE使w, ,s 语言环境相关
    re.Sre.DOTALL点匹配所有