黑马程序员技术交流社区

标题: 正则表达式关于组的概念 [打印本页]

作者: 偏執旳、靑春    时间: 2013-3-3 11:29
标题: 正则表达式关于组的概念
毕老师说的组的概念,还是理解的不是很清楚,麻烦高手讲讲
最好用代码实现多个的组的用法{:soso_e128:}

作者: wahaha    时间: 2013-3-3 11:45
朋友,我自己说不好,借用别人的解释,希望能帮到你
Java正则表达式应用
一、概述
正则表达式是Java处理字符串、文本的重要工具。
Java对正则表达式的处理集中在以下两个两个类:
java.util.regex.Matcher   模式类:用来表示一个编译过的正则表达式。
java.util.regex.Pattern   匹配类:用模式匹配一个字符串所表达的抽象结果。
(很遗憾,Java Doc并没有给出这两个类的职责概念。)

比如一个简单例子:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* 正则表达式例子
*
* @author leizhimin 2009-7-17 9:02:53
*/

public class TestRegx {
        public static void main(String[] args) {
                Pattern p = Pattern.compile("f(.+?)k");
                Matcher m = p.matcher("fckfkkfkf");
                while (m.find()) {
                        String s0 = m.group();
                        String s1 = m.group(1);
                        System.out.println(s0 + "||" + s1);
                }
                System.out.println("---------");
                m.reset("fucking!");
                while (m.find()) {
                        System.out.println(m.group());
                }

                Pattern p1 = Pattern.compile("f(.+?)i(.+?)h");
                Matcher m1 = p1.matcher("finishabigfishfrish");
                while (m1.find()) {
                        String s0 = m1.group();
                        String s1 = m1.group(1);
                        String s2 = m1.group(2);
                        System.out.println(s0 + "||" + s1 + "||" + s2);
                }

                System.out.println("---------");
                Pattern p3 = Pattern.compile("(19|20)\\d\\d([- /.])(0[1-9]|1[012])\\2(0[1-9]|[12][0-9]|3[01])");
                Matcher m3 = p3.matcher("1900-01-01 2007/08/13 1900.01.01 1900 01 01 1900-01.01 1900 13 01 1900 02 31");
                while (m3.find()) {
                        System.out.println(m3.group());
                }
        }
}


输出结果:
fck||c
fkk||k
---------
fuck
finish||in||s
fishfrish||ishfr||s
---------
1900-01-01
2007/08/13
1900.01.01
1900 01 01
1900 02 31

Process finished with exit code 0


二、一些容易迷糊的问题
1、Java对反斜线处理的问题
在其他语言中,\\表示要插入一个字符\;
在Java语言中,\\表示要插入正则表达式的反斜线,并且后面的字符有特殊意义。
但是看看上面程序,对比下不难看出:
\d在实际使用的时候就写成了 \\d;
在Java正则表达式中,如果要插入一个\字符,则需要在正则表达式中写成[url=]\\\\[/url],原因是下面的APIDoc定义\\表示一个反斜线。
但是如果在正则表示式中表示回车换行等,则不需要多添加反斜线了。比如回车\r就写作\r.

2、Matcher.find():尝试查找与模式匹配的字符序列的下一个子序列。此方法从字符序列的开头开始,如果该方法的前一次调用成功了并且从那时开始匹配器没有被重置,则从以前匹配操作没有匹配的第一个字符开始,即如果前一次找到与模式匹配的子序列则这次从这个子序列后开始查找。


3、Matcher.matchers():判断整个字符序列与模式是否匹配。当连续用Matcher对象检查多个字符串时候,可以使用
Matcher.reset():重置匹配器,放弃其所有显式状态信息并将其添加位置设置为零。
或者Matcher.reset(CharSequence input)  重置此具有新输入序列的匹配器。
来重复使用匹配器。


4、组的概念,这个概念很重要,组是用括号划分的正则表达式,可以通过编号来引用组。组号从0开始,有几对小括号就表示有几个组,并且组可以嵌套,组号为0的表示整个表达式,组号为1的表示第一个组,依此类推。
例如:A(B)C(D)E正则式中有三组,组0是ABCDE,组1是B,组2是D;
A((B)C)(D)E正则式中有四组:组0是ABCDE,组1是BC,组2是B;组3是C,组4是D。
int groupCount():返回匹配其模式中组的数目,不包括第0组。
String group():返回前一次匹配操作(如find())的第0组。
String group(int group):返回前一次匹配操作期间指定的组所匹配的子序列。如果该匹配成功,但指定组未能匹配字符序列的任何部分,则返回 null。
int start(int group):返回前一次匹配操作期间指定的组所匹配的子序列的初始索引。
int end(int group):返回前一次匹配操作期间指定的组所匹配的子序列的最后索引+1。


5、匹配的范围的控制
最变态的就要算lookingAt()方法了,名字很让人迷惑,需要认真看APIDoc。
start()  返回以前匹配的初始索引。
end()  返回最后匹配字符之后的偏移量。
public boolean lookingAt()尝试将从区域开头开始的输入序列与该模式匹配。
与 matches 方法类似,此方法始终从区域的开头开始;与之不同的是,它不需要匹配整个区域。
如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
返回:
当且仅当输入序列的前缀匹配此匹配器的模式时才返回 true。


6、Pattern标记
Pattern类的静态方法
static Pattern compile(String regex, int flags)
          将给定的正则表达式编译到具有给定标志的模式中。
其中的flags参数就是Pattern标记,这个标记在某些时候非常重要。

Pattern.CANON_EQ
          启用规范等价。
Pattern.CASE_INSENSITIVE
          启用不区分大小写的匹配。

等等....

四、字符串的切分
String[] split(String regex)
          根据给定的正则表达式的匹配来拆分此字符串。
String[] split(String regex, int limit)
          根据匹配给定的正则表达式来拆分此字符串。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2