黑马程序员——java语言基础——正则表达式

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

类 Pattern

    完整类是java.util.regex.Pattern,并实现接口Serializable,它是正则表达式的编译表示形式。故指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。   也就是说加入说我们要进行字符串匹配的话,思路应该是:获取Pattern实例——》获取Matcher对象,即匹配器——》调用Matcher中相应的方法来获取所要的结果。

    先来看Pattern类的方法:

获取Pattern类的实例对象:调用类的静态方法compile(regx),传入的参数是正则表达式的字符串表现形式;

获取匹配器:用Pattern对象调用非静态方法Matcher matcher(CharSequence input),传入的参数是要匹配的字符序列;

获取正则表达式:用Pattern对象调用非静态方法String pattern() 和方法String toString() ;

拆分字符序列:

1、public String[] split(CharSequence input,int limit)围绕此模式的匹配拆分给定输入序列。此方法返回的数组包含输入序列的子字符串,limit 参数控制应用模式的次数,从而影响结果数组的长度。如果限制 n 大于零,那么模式至多应用 n> - 1 次,数组的长度不大于 n,并且数组的最后条目将包含除最后的匹配定界符之外的所有输入。如果 n 非正,那么将应用模式的次数不受限制,并且数组可以为任意长度。如果 n 为零,那么应用模式的次数不受限制,数组可以为任意长度,并且将丢弃尾部空字符串。

例如,输入 "boo:and:foo" 将产生以下结果及参数:Regex Limit Result

: 2 { "boo", "and:foo" }

: 5 { "boo", "and", "foo" }

: -2 { "boo", "and", "foo" }

o 5 { "b", "", ":and:f", "", "" }

o -2 { "b", "", ":and:f", "", "" }

o 0 { "b", "", ":and:f" }

2、public String[] split(CharSequence input) 围绕此模式的匹配拆分给定输入序列。 此方法的工作方式类似于使用给定的输入序列和限制参数零调用两参数 (java.lang.CharSequence, int) split} 方法。因此,得到的数组中不包括尾部空字符串。

例如,输入 "boo:and:foo" 将产生以下结果及表达式:Regex Result

: { "boo", "and", "foo" }

o { "b", "", ":and:f" }

                           正则表达式的规则及要求
      

如果需要指定字符串中的字符范围,则用以下:

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

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

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

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

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

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

如果需要指定字符串中的数字范围,则用以下:

\d 数字:[0-9]

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

如果需要指定字符串中某一位置为边界,则用以下:

^ 行的开头

$ 行的结尾

\b 单词边界

\B 非单词边界

\A 输入的开头

\G 上一个匹配的结尾

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

\z 输入的结尾

如果需要指定某字符或数字出现的次数,则用以下:

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

X*      X,零次或多次

X+      X,一次或多次

X{n}    X,恰好 n 次

X{n,}   X,至少 n 次

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

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

1 ((A)(B(C)))

2 \A

3 (B(C))

4 (C)

组零始终代表整个表达式。然后引用组可用\n表示(其中n为编号,组的编号是从左括号开始,从左至右,第一个左括号标为1,第二个为2,后面依次类推)。

例如:adfgaagjkbbfdccc,我们要获取aa,bb,cc,可以使用组(\\s)\1
如果需要重复多次的字符去重为一个,应该用重复的字符替换为"$1"。

类Matcher

该类public final class Matcher extends Object implements MatchResult通过解释 Pattern 对 character sequence 执行匹配操作的引擎。
通过调用模式的 matcher 方法从模式创建匹配器。创建匹配器后,可以使用它执行三种不同的匹配操作:
 matches 方法尝试将整个输入序列与该模式匹配。
lookingAt 尝试将输入序列从头开始与该模式匹配。
find 方法扫描输入序列以查找与该模式匹配的下一个子序列。
例如,用find方法扫毛输入序列,获取子序列的过程将使用到的方法有:

String group() 返回由以前匹配操作所匹配的输入子序列。

int end() 返回最后匹配字符之后的偏移量。

boolean find() 尝试查找与该模式匹配的输入序列的下一个子序列。

int start() 返回以前匹配的初始索引。

实现参考代码:
     
String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程";
		Pattern p = Pattern.compile("(.)\\1+");
		Matcher m = p.matcher(str);
		while(m.find()) {
			System.out.println(m.group()+";"+m.start()+";"+m.end());
		}


总结:正则表达式可以简化字符串的操作,但是阅读性会相应降低。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值