Java 正则表达式

 今天看了java的正则表达式,觉得他真的是太神奇了。原来就听说他很好用,但是一直没有去看,可能是因为在我原来的思想里,我认为他不能达到精确的匹配。要是这样的话他的功能不会强大到那里去。可是今天看了一点,我就改变了我的这种错误的想法。突然我就想去了,前一段时间参加的那个网络攻防大赛中有一道题,是求一个文件里面符合条件的ip的个段的数字的和。这个题主要的难点就在于提取里面符合条件的ip,而这个提取的工作就是要用到正则表达式,可是当时我没有看正则表达式,就用普通的字符串操作做了。虽然也不是很复杂,但是回想要是当初看了他,用他我想那个题不用吹灰之力就能解决。

    好了,说了这么多,还是让我们来看看他到底有什么好!

    首先我们一定要学的是匹配字符串的构造:

句点"."符号匹配所有的字符,包括空格,tab字符甚至是换行符。
方括号"[]"匹配方括号里面的一个字符。只能是一个字符。但是如果是一个范围的话,则可以是这个范围内的任意字符,一般的和{n}或者是{n,m}一起用。
如果想匹配几个字符用(|)个。如:(a|e|ww|eeii)
这些符号用来确定紧靠该符号(左边的符号)出现的次数:
*:表示出现0次或者多次;
+:表示出现1次或者多次;
?:表示出现0次或者1次;
{n}:表示恰好n次;
{n,m}:表示从n次到m次;
^ 表示非,就是除了这个字符以外的其他;
&&表示就交集

字符型: 

[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)


/d 表示[0-9]
/D 表示[^0-9]
/w 表示[a-z A-Z 0-9]
/W 表示[^/w]
/s 表示空白字符[/t/n/xob/f/r]
/S 表示[^/s]

//也是通常和{n}或者{n,m}一起用。
/p{Lower} 小写字母字符:[a-z]   例如://p{Lower}{n}小写字母出现n次。其他的同理。
/p{Upper} 大写字母字符:[A-Z]
/p{ASCII} 所有 ASCII:[/x00-/x7F]
/p{Alpha} 字母字符:[/p{Lower}/p{Upper}]
/p{Digit} 十进制数字:[0-9]
/p{Alnum} 字母数字字符:[/p{Alpha}/p{Digit}]
/p{Punct} 标点符号:!"#$%&'()*+,-./:;<=>?@[/]^_`{|}~
/p{Graph} 可见字符:[/p{Alnum}/p{Punct}]
/p{Print} 可打印字符:[/p{Graph}/x20]
/p{Blank} 空格或制表符:[ /t]
/p{Cntrl} 控制字符:[/x00-/x1F/x7F]
/p{XDigit} 十六进制数字:[0-9a-fA-F]
/p{Space} 空白字符:[ /t/n/x0B/f/r]


java.lang.Character 类(简单的 java 字符类型)
/p{javaLowerCase} 等效于 java.lang.Character.isLowerCase()
/p{javaUpperCase} 等效于 java.lang.Character.isUpperCase()
/p{javaWhitespace} 等效于 java.lang.Character.isWhitespace()
/p{javaMirrored} 等效于 java.lang.Character.isMirrored()
 
Unicode 块和类别的类
/p{InGreek} Greek 块(简单块)中的字符
/p{Lu} 大写字母(简单类别)
/p{Sc} 货币符号
/P{InGreek} 所有字符,Greek 块中的除外(否定)
[/p{L}&&[^/p{Lu}]]  所有字母,大写字母除外(减去)

还有一些没有列出来,我觉得写一般的程序 上面的这些就足够了。

 

除了了解这些外,我们还必须知道的就是几个重要的方法。

import java.util.regex.Pattern;

import java.util.regex.Matcher;

Pattern pattern=Pattern.compile("要匹配的字符串形式");

Matcher matcher=pattern.matcher("原字符串");

还有就是Matcher类中的boolean find();//判断是不是有相匹配的字符串

String group();//输出相匹配的子字符串;

最后我们来看一个程序说明这几个方法:

import java.util.regex.*;
public class MatchDemo {
 public static void main(String[] args) {
  String phones1="justin的手机号码:0939-100391/n"+"monor的手机号码:0939-666888/n";
  //Pattern pattern=Pattern.compile(".*0939-//d{6}");//注意这里几种形式的效果是一样的。
  Pattern pattern=Pattern.compile(".*0939-//p{Digit}{6}");
  Matcher matcher=pattern.matcher(phones1);
  while(matcher.find()) {
   System.out.println(matcher.group());
  }
  String phones2="caterpillar'phonenumber:0952-600391/n"+
   "bush'phonenumber:0939-550391";
  matcher=pattern.matcher(phones2);
  while(matcher.find()) {
   System.out.println(matcher.group());
  }
  String ip="jflaj134.33.34.66:80jwljljaif134.32.34.66:80fadf135.33.34.66:80jflaj";
  pattern=Pattern.compile("//d{1,3}.//d{1,3}.//d{1,3}.//d{1,3}:80");
  matcher=pattern.matcher(ip);
  while(matcher.find()) {
   System.out.println(matcher.group());
  }
 }
}/*output:

justin的手机号码:0939-100391

monor的手机号码:0939-666888

bush'phonenumber:0939-550391

134.33.34.66:80

134.33.34.66:80

134.33.34.66:80

*///~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值