`
huzhenyu
  • 浏览: 192684 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

正则表达式

    博客分类:
  • JAVA
阅读更多
1、 正则表达式元字符

. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意空白字符
\d \d匹配数字
\b 匹配单词的开始或结束
$ 匹配字符串的结束
[abcd] 匹配字符’a’,’b’,’c’,’d’字符

2、 正则表达式的反义
\W 匹配任意不是字母或数字或下划线或汉字
\S 匹配不是空白字符
\D 匹配非数字的字符
\B 匹配不是单词开始或结束的位置
[^X] 除X以外的任意字符
[^aeiou] 匹配字符串的结束
[abcd] 匹配除aeiou字母以外的其它任意字符

3、 重复

* 重复0次或更多次
+ 重复一次或更多次

? 重复0次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

4、分支条件 |
0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。

5、贪婪与懒惰

*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复

?? 重复0次或1次,但尽可能少重复

{n,m}? 重复n到m次,但尽可能少重复

{n,}? 重复n次以上,但尽可能少重复
    举例1:表达式 "<td>(.*)</td>" 与字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 匹配时,匹配的结果是:成功;匹配到的内容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整个字符串, 表达式中的 "</td>" 将与字符串中最后一个 "</td>" 匹配。
    举例2:相比之下,表达式 "<td>(.*?)</td>" 匹配举例1中同样的字符串时,将只得到 "<td><p>aa</p></td>", 再次匹配下一个时,可以得到第二个 "<td><p>bb</p></td>"。

6、处理选项
Ignorecase 默认情况下,表达式中的字母是要区分大小写的。配置为 Ignorecase 可使匹配时不区分大小写。有的表达式引擎,把 "大小写" 概念延伸至 UNICODE 范围的大小写。

Singleline 默认情况下,小数点 "." 匹配除了换行符(\n)以外的字符。配置为 Singleline 可使小数点可匹配包括换行符在内的所有字符。

Multiline 默认情况下,表达式 "^" 和 "$" 只匹配字符串的开始 ① 和结尾 ④ 位置。如:
①xxxxxxxxx②\n
③xxxxxxxxx④
配置为 Multiline 可以使 "^" 匹配 ① 外,还可以匹配换行符之后,下一行开始前 ③ 的位置,使 "$" 匹配 ④ 外,还可以匹配换行符之前,一行结束 ② 的位置。

Global 主要在将表达式用来替换时起作用,配置为 Global 表示替换所有的匹配。
ExplicitCapture 仅捕获已被显式命名的组。
ECMAScript(JavaScript兼容模式) 使表达式的行为与它在JavaScript里的行为一致。
RightToLeft(从右向左查找) 匹配从右向左而不是从左向右进行。

7、反向引用 \1, \2...
    表达式在匹配时,表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。这一点,在前面的举例中,已经多次展示了。在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。比如前面的 "<td>(.*?)</td>"。
    其实,"小括号包含的表达式所匹配到的字符串" 不仅是在匹配结束后才可以使用,在匹配过程中也可以使用。表达式后边的部分,可以引用前面 "括号内的子匹配已经匹配到的字符串"。引用方法是 "\" 加上一个数字。"\1" 引用第1对括号内匹配到的字符串,"\2" 引用第2对括号内匹配到的字符串……以此类推,如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 "(" 在前,那这一对就先排序号。
    举例如下:
    举例1:表达式 "('|")(.*?)(\1)" 在匹配 " 'Hello', "World" " 时,匹配结果是:成功;匹配到的内容是:" 'Hello' "。再次匹配下一个时,可以匹配到 " "World" "。
    举例2:表达式 "(\w)\1{4,}" 在匹配 "aa bbbb abcdefg ccccc 111121111 999999999" 时,匹配结果是:成功;匹配到的内容是 "ccccc"。再次匹配下一个时,将得到 999999999。这个表达式要求 "\w" 范围的字符至少重复5次,注意与 "\w{5,}" 之间的区别。
    举例3:表达式 "<(\w+)\s*(\w+(=('|").*?\4)?\s*)*>.*?</\1>" 在匹配 "<td id='td1' style="bgcolor:white"></td>" 时,匹配结果是成功。如果 "<td>" 与 "</td>" 不配对,则会匹配失败;如果改成其他配对,也可以匹配成功。

8、其它通用规则
8.1 表达式中,可以使用 "\xXX" 和 "\uXXXX" 表示一个字符("X" 表示一个十六进制数)
  \xXX 编号在 0 ~ 255 范围的字符,比如:空格可以使用 "\x20" 表示

  \uXXXX 任何字符可以使用 "\u" 再加上其编号的4位十六进制数表示,比如:"\u4E2D"
8.2在表达式中有特殊意义,需要添加 "\" 才能匹配该字符本身的字符汇总
^ 匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 "\^"
$ 匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 "\$"
( ) 标记一个子表达式的开始和结束位置。要匹配小括号,请使用 "\(" 和 "\)"
[ ] 用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号,请使用 "\[" 和 "\]"
{ } 修饰匹配次数的符号。要匹配大括号,请使用 "\{" 和 "\}"
. 匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用 "\."
? 修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身,请使用 "\?"
+ 修饰匹配次数为至少 1 次。要匹配 "+" 字符本身,请使用 "\+"
* 修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 "\*"
| 左右两边表达式之间 "或" 关系。匹配 "|" 本身,请使用 "\|"

8.3 如果要要求表达式所匹配的内容是整个字符串,而不是从字符串中找一部分,那么可以在表达式的首尾使用 "^" 和 "$",比如:"^\d+$" 要求整个字符串只有数字。

8.4如果要求匹配的内容是一个完整的单词,而不会是单词的一部分,那么在表达式首尾使用 "\b",比如:使用 "\b(if|while|else|void|int……)\b" 来匹配程序中的关键字。

8.5表达式不要匹配空字符串。否则会一直得到匹配成功,而结果什么都没有匹配到。比如:准备写一个匹配 "123"、"123."、"123.5"、".5" 这几种形式的表达式时,整数、小数点、小数数字都可以省略,但是不要将表达式写成:"\d*\.?\d*",因为如果什么都没有,这个表达式也可以匹配成功。更好的写法是:"\d+\.?\d*|\.\d+"。

8.6能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配 0 次,而这个括号整体又可以匹配无限次,那么情况可能比上一条所说的更严重,匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了,比如 .NET 的正则表达式,但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环,也可以从这一点入手,查找一下是否是本条所说的原因。

8.7或 "|" 的左右两边,对某个字符最好只有一边可以匹配,这样,不会因为 "|" 两边的表达式因为交换位置而有所不同。

网上搜集的正则表达式

// 正数验证,零不行
^(([1-9]+[0-9]*.{1}[0-9]+)|([0].{1}[1-9]+[0-9]*)|([1-9][0-9]*)|([0][.][0-9]+[1-9]*))$
//正数,负数验证,零不行
^(-)?(([1-9]+[0-9]*.{1}[0-9]+)|([0].{1}[1-9]+[0-9]*)|([1-9][0-9]*)|([0][.][0-9]+[1-9]*))$

1。^\d+$  //匹配非负整数(正整数 + 0)
2。^[0-9]*[1-9][0-9]*$  //匹配正整数
3。^((-\d+) |(0+))$  //匹配非正整数(?整数 + 0)
4。^-[0-9]*[1-9][0-9]*$  //匹配负整数
5。^-?\d+$    //匹配整数
6。^\d+(\.\d+)?$  //匹配非负浮点数(正浮点数 + 0)
7。^(([0-9]+\.[0-9]*[1-9][0-9]*) |([0-9]*[1-9][0-9]*\.[0-9]+) |([0-9]*[1-9][0-9]*))$  //匹配正浮点数
8。^((-\d+(\.\d+)?) |(0+(\.0+)?))$  //匹配非正浮点数(?浮点数 + 0)
9。^(-(([0-9]+\.[0-9]*[1-9][0-9]*) |([0-9]*[1-9][0-9]*\.[0-9]+) |([0-9]*[1-9][0-9]*)))$  //匹配负浮点数
10。^(-?\d+)(\.\d+)?$  //匹配浮点数
11。^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
12。^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
13。^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
14。^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
15。^\w+$  //匹配由数字、26个英文字母或者下???成的字符串
16。^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$    //匹配email地址
17。^[a-zA-z]+://匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$  //匹配url
18。匹配中文字符的正?表?式: [\u4e00-\u9fa5]
19。匹配双字?字符(包括?字在内):[^\x00-\xff]
20。?用:?算字符串的?度(一个双字?字符?度?2,ASCII字符?1)
String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}
21。匹配空行的正?表?式:\n[\s | ]*\r
22。匹配HTML??的正?表?式:/ <(.*)>.* <\/\1> | <(.*) \/>/
23。匹配首尾空格的正?表?式:(^\s*) |(\s*$)

* 正?表?式用例
  * 1、^\S+[a-z A-Z]$ 不能?空 不能有空格  只能是英文字母
  * 2、\S{6,}        不能?空 六位以上
  * 3、^\d+$          不能有空格 不能非数字
  * 4、(.*)(\.jpg |\.bmp)$ 只能是jpg和bmp格式
  * 5、^\d{4}\-\d{1,2}-\d{1,2}$ 只能是2004-10-22格式
  * 6、^0$            至少?一?
  * 7、^0{2,}$        至少???
  * 8、^[\s |\S]{20,}$ 不能?空 二十字以上
  * 9、^\+?[a-z0-9](([-+.] |[_]+)?[a-z0-9]+)*@([a-z0-9]+(\. |\-))+[a-z]{2,6}$?件
  * 10、\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*([,;]\s*\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)* ?入多个地址用逗号或空格分隔?件
  * 11、^(\([0-9]+\))?[0-9]{7,8}$??号?7位或8位或前面有区号例如(022)87341628
  * 12、^[a-z A-Z 0-9 _]+@[a-z A-Z 0-9 _]+(\.[a-z A-Z 0-9 _]+)+(\,[a-z A-Z 0-9 _]+@[a-z A-Z 0-9 _]+(\.[a-z A-Z 0-9 _]+)+)*$
  *    只能是字母、数字、下??;必?有@和.同?格式要?范 ?件
  * 13 ^\w+@\w+(\.\w+)+(\,\w+@\w+(\.\w+)+)*$上面表?式也可以写成??子,更精?。
    14  ^\w+((-\w+) |(\.\w+))*\@\w+((\. |-)\w+)*\.\w+$

21。匹配空行的正?表?式:\n[\s | ]*\r
21。匹配空行的正?表?式:/^\s*$/m

22。匹配HTML??的正?表?式:/ <(.*)>.* <\/\1> | <(.*)\/>/
22。匹配HTML??的正?表?式:/ <([^>]+)>[^ <>]* <\/\1> | <([^>]+)\/>/
?个??上作用不大,因?正?表?式不能支持嵌套匹配,? .NET 的表?式引擎有?个功能。

23。匹配首尾空格的正?表?式:(^\s*) |(\s*$)
23。匹配首尾空格的正?表?式:^\s+ |\s+$
    ? JavaScript 的 String 增加 trim() 函数:
    String.prototype.trim = function() {
      return this.replace(/^\s+/, '').replace(/\s+$/, '');
  }

* 4、(.*)(\.jpg |\.bmp)$ 只能是jpg和bmp格式
* 4、([^.]+)\.(jpg |bmp) 只能是jpg和bmp格式

* 8、^[\s |\S]{20,}$ 不能?空 二十字以上
* 8、^\S{20,}$ 不能?空 二十字以上

Demo
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
 public void PatternTest() {
  String exp = "<td.*?>";
  Pattern p = Pattern.compile(exp);
  String s = "<td colspan=\"6\" class=\"pi\">ccccaaaaa</td><td colspan=\"6\" class=\"pi\">cccccaaaaa</td>";
  Matcher matcher = p.matcher(s);
  while (matcher.find()) {
   String str = "";
   String result = matcher.group();
   int c = s.indexOf("colspan");
   if (c != -1) {
    str = " " + s.substring(c, c + 11);
   }
   s = s.replace(result , "<td" + str + ">");
  }
  System.out.println(s);

 }

 public static void main(String args[]) {
  Test t = new Test();
  t.PatternTest();
 }
}

分享到:
评论

相关推荐

    qt使用正则表达式限制lineEdit的输入,对正则表达式进行了封装,可以直接引入,工程编译正常

    在Qt框架中,正则表达式(Regular Expression)是一种强大的文本处理工具,它允许程序员以结构化的方式匹配、查找、替换或验证字符串。本项目针对Qt的lineEdit组件,通过正则表达式实现了输入限制功能,使得lineEdit...

    正则表达式转换工具

    正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,它用于匹配、查找、替换等操作,涉及字符串处理的各个领域。正则表达式转换工具是专门针对这一需求而设计的,它能帮助用户将输入的内容转换...

    PB实现的正则表达式

    在IT领域,正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,它能够进行复杂的模式匹配、查找、替换等操作。在本话题中,我们将探讨如何使用PowerBuilder 11.5这一经典的开发环境来实现正则...

    易语言正则表达式文本替换

    例如,"子程序_正则文本替换"可能就是一个易语言中用于执行正则表达式替换的子程序,它接收输入的文本、正则表达式模式和替换字符串,然后返回经过替换操作的新文本。 1. **正则表达式基础** - **元字符**:如`.`...

    C语言正则表达式库

    C语言正则表达式库是用于在C编程环境中处理和匹配正则表达式的软件库。这个库名为PCRE(Perl Compatible Regular Expressions),正如其名,它与Perl语言中的正则表达式语法高度兼容,提供了丰富的功能和强大的匹配...

    pb 使用正则表达式源码pbregexp

    标题中的“pb 使用正则表达式源码pbregexp”指的是在PowerBuilder(简称pb)环境中,利用名为“pbregexp”的正则表达式组件来实现源代码级别的正则表达式操作。PowerBuilder是一款流行的可视化的、面向对象的软件...

Global site tag (gtag.js) - Google Analytics