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

今天上午翻了一下自己无聊学习了一个月的正则表达式,忽然发现好多的都忘记了.
所以现在打算温习下,顺表做个笔记.
打算写一个系列,努力去坚持.
基本按照书本章节来写
start:

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

进入技术性学习:

1:行的起始和结束 ^ $
2:字符组 是以[]作为字符组的 比如[ab][color=red]
注意:在字符组内部,[b]字符组元字符-[/b]表示一个范围[/color] eg:[a-z]
3:排除性字符走 [^ab][color=red]
注意:排除型字符组表示"匹配一个未列出的字符",而不是"不要匹配列出的字符"[/color]
4:点号匹配任意字符
5:多选结构
...|...|...
在这里作者提到了多选结构和字符组的一个有点搞的东西,自己在第一次看的时候也被弄忽悠了,作者最后在后面解释:
[color=red]一个[b]字符组[/b]只能匹配目标文本的[b]单个字符[/b],而每个多选结构自身都可能是完整的正则表达式,都可以匹配任意长度的文本.[/color]
ps:我在后面看到,正则中的条件判断,类似java中的三目运算符,可以模拟多选
6:忽略大小写
这个自己觉的很有用,刚刚入行的时候,想用这个功能,问了很多人,都不知道...
暂时先给出一个egrep的例子,后面仔细描述
egrep [color=red]-i[/color] '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)");
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值