论坛首页 综合技术论坛

<精通正则表达式>学习笔记(一)

浏览 2110 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-08-14   最后修改:2009-08-14
今天上午翻了一下自己无聊学习了一个月的正则表达式,忽然发现好多的都忘记了.
所以现在打算温习下,顺表做个笔记.
打算写一个系列,努力去坚持.
基本按照书本章节来写
start:

第一章 正则表达式入门
   作为对程序员来说,一些描述性,摘要性的东西我就不多说了.作为一个笔记类的文章,我大概在里面写一些自己在学习过程中觉得应该注意的,或者比较重点的东西.当然,很多都是自己主观的,大家有意见可以提出.
   在这本书中,作者很推崇perl,我看了之后,觉的perl真的是很适合去做正则的一些工作.但是自己perl基本是只是熟悉语法,遗憾...只有慢慢学习了!

进入技术性学习:

1:行的起始和结束 ^ $
2:字符组 是以[]作为字符组的 比如[ab]
  注意:在字符组内部,字符组元字符-表示一个范围
eg:[a-z]
3:排除性字符走 [^ab]
  注意:排除型字符组表示"匹配一个未列出的字符",而不是"不要匹配列出的字符"

4:点号匹配任意字符
5:多选结构
  ...|...|...
  在这里作者提到了多选结构和字符组的一个有点搞的东西,自己在第一次看的时候也被弄忽悠了,作者最后在后面解释:
一个字符组只能匹配目标文本的单个字符,而每个多选结构自身都可能是完整的正则表达式,都可以匹配任意长度的文本.
ps:我在后面看到,正则中的条件判断,类似java中的三目运算符,可以模拟多选
6:忽略大小写
这个自己觉的很有用,刚刚入行的时候,想用这个功能,问了很多人,都不知道...
暂时先给出一个egrep的例子,后面仔细描述
egrep -i 'a' abbba (暂时未测试)
7:单词边界  \<(起始) \>(结束) \B \b
8:可选项元素 ? colou?r 这个u可以出现,也可以不出现.出现频率最多出现一次.类似实现方式有colou{0,1}r
9:重复出现
+ 一次或多次 至少一次
* 零次或多次 最少零次
10:区间
{min.max}
11:捕获以及反向引用
解释 捕获:一般正则表达式中括号中匹配内容会被捕获,也就是被规则引擎保存
      反向引用:对捕获的内容,进行引用
eg:\<([A-Za-z])+\1\>  [A-Za-z] 是被捕获内容  \1是对它的反向引用
注:各个语言中的捕获,以及反向引用可能实现方式不同,但是概念是一样的
12:转义 \char

附上java的一个简单代码,对上面的进行简单代码实现.
package com.cn;

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

class RegularTest {

	/**
	 * 简单匹配
	 * 
	 * @param testString
	 *            测试字符
	 * @param regular
	 *            测试正则表达式
	 */
	private static void MarchRegular(final String testString,
			final String regular) {
		Pattern pattern = Pattern.compile(regular);
		Matcher marcher = pattern.matcher(testString);

		System.out.print(regular + "匹配" + testString + ":");
		if (marcher.find()) {
			System.out.println("OK");
		} else {
			System.out.println("NG");
		}
	}

	/**
	 * 捕获及反向引用
	 * 
	 * @param testString
	 *            测试字符
	 * @param regular
	 *            测试正则表达式
	 */
	private static void MarchGroup(final String testString, final String regular) {
		Pattern pattern = Pattern.compile(regular);
		Matcher matcher = pattern.matcher(testString);

		if (matcher.find()) {
			System.out.print(regular + "匹配" + testString + "OK");
			int groupCount = 0;
			groupCount = matcher.groupCount();
			for (int i = 0; i < groupCount; i++) {

				System.out.print("第" + i + "个捕获值为:" + matcher.group(i + 1));
			}
		} else {
			System.out.print(regular + "匹配" + testString + "NG");
		}
	}

	public static void main(String[] args) {
		/*
		 * ^ $
		 */
		MarchRegular("abb", "^a*b$");
		MarchRegular("abbc", "^a*b$");
		/*
		 * [ab]
		 * 
		 */
		MarchRegular("a", "[abc]");
		MarchRegular("d", "[abc]");
		/*
		 * [^ab]
		 */
		MarchRegular("d", "[^abc]");
		MarchRegular("a", "[^abc]");
		/*
		 * 点号匹配任意字符
		 */
		MarchRegular("a", ".");
		/*
		 * 多选结构
		 */
		MarchRegular("a", "a|b|bc");
		MarchRegular("bc", "a|b|bc");
		MarchRegular("bd", "a|b|bc");
		MarchRegular("d", "a|b|bc");

		/*
		 * 忽略大小写 java中忽略大小写还有另一种写法,
		 * Pattern.compile的第二个参数:Pattern.CASE_INSENSITIVE)
		 * 
		 */
		MarchRegular("d", "(?i:D)");
		MarchRegular("D", "(?i:d)");

		/*
		 * 单词边界 \\b 这里\b是对应单词边界 \\b其中对\进行了转义
		 */
		MarchRegular("test", "\\btest\\b");
		MarchRegular("tes", "\\btest\\b");

		/*
		 * 可选项元素 ?
		 */
		MarchRegular("tes", "test?");
		MarchRegular("test", "test?");
		MarchRegular("tesm", "test?");

		/*
		 * + *
		 */
		MarchRegular("test", "test+");
		MarchRegular("testt", "test+");
		MarchRegular("tes", "test+");

		MarchRegular("test", "test*");
		MarchRegular("testt", "test*");
		MarchRegular("tes", "test*");
		MarchRegular("tess", "test*");
		MarchRegular("tem", "test*");

		/*
		 * 区间
		 */
		MarchRegular("m", "m{0,4}");
		MarchRegular("mm", "m{0,4}");
		MarchRegular("mmm", "m{0,4}");
		MarchRegular("mmmm", "m{0,4}");
		MarchRegular("mm", "m{3,4}");

		/*
		 * 捕获以及反向引用 java中反向引用采用 matcher.group(arg)
		 */
		MarchGroup("mmaa", "(m)(a)");
	}
}


论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics