<< mrtg流量中文显示$1$2的问题 | 主页 | 在线生成密码 >>

过滤标记属性的java正则表达式

一段过滤网页中个别标记属性值的java正则表达式代码,方便CSS排版。

try {
     Pattern pattern = Pattern.compile("<\\s{0,}((span)|(font)|(div))\\s{0,}[^>]*>");
     String input= readTextFileToString("c:\\index.html");
     StringBuffer output = new StringBuffer();
     Matcher matcher = pattern.matcher(input);
     while (matcher.find()){
          matcher.appendReplacement(output, "<"+matcher.group(1)+">");
          //for (int i=1;i<=matcher.groupCount();i++){
          // System.out.print(matcher.group(i)+"|");
          //}
          //System.out.println();
     }
     matcher.appendTail(output);
     System.out.println(output);
     System.out.println("end!");
}catch(IOException e){
     e.printStackTrace();
}

正则表达式说明:<\\s{0,}((span)|(font)|(div))\\s{0,}[^>]*>
<表示标记起点;\\s{0,}0个或者多个空格,tab等不可见字符,\s表示不可见字符,java需要转义,故此为\\s;(span)|(font)|(div)表示三个标记,这里还可以增加,例如(span)|(font)|(div)|(body);这三个标记使用分组,根据分组原则,分别为2,3,4...;((span)|(font)|(div))作为整个分组,同样根据分组原则,应为为1组,0组为整个匹配字符串;紧接着最后一个\\s{0,}含义同第一个;[^>]*表示任意个任意字符,但是不能为>;最后一个字符>作为结束界标;

如果希望查看分组情况,可以去掉以下代码的注释:

...
          for (int i=1;i<=matcher.groupCount();i++){
           System.out.print(matcher.group(i)+"|");
          }
          System.out.println();
     }
...

如果是div标签,则输出为 div|null|null|div|
如果是span标签,则输出为span|span|null|null|
如果是font标签,则输出为font|null|font|null|

分组在替换过程中的作用非常大,如果仅仅想要font中的文字,分组4则为我们所需要内容。代码如下:

...
Pattern pattern = Pattern.compile("<\\s{0,}((span)|(font)|(div))\\s{0,}[^>]*>(.*)<\\s{0,}/\\s{0,}\\1\\s{0,}");
...

输出结果为:font|null|font|null|关闭|

值得注意的是(.*)仅仅可以工作在没有换行的情况下,如果标记内容中有换行符出现,这段代码有可能出现问题,java的文档是这样描述这个问题的,

. Any character (may or may not match line terminators)

所以,如果可能的话,先对代码的换行做预处理工作。

其他常用的正则表达式范例(本人未测试),如果在java中使用需要对\进行转义为\\.

  • 匹配中文字符的正则表达式: [\u4e00-\u9fa5]
  • 匹配双字节字符(包括汉字在内):[^\x00-\xff]
  • 匹配空行的正则表达式:\n[\s| ]*\r
  • 匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/
  • 匹配首尾空格的正则表达式:(^\s*)|(\s*$)
  • 匹配IP地址的正则表达式:[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
  • 匹配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,''))"

几个有用的java正则表达式资料,可以看看:
正则表达式详解 http://www.ccw.com.cn/htm/app/aprog/01_7_31_4.asp(非常经典的教程,强烈推荐)
正则表达式专栏 http://www.javaeye.com/subject/Regular-Expression(常用的正则表达式,虽然有些考虑不周,但是具有参考意义)

 




置评 发送回接