RegEx
shangboerds
淡薄以明志,宁静而致远
展开
-
匹配时刻
-- Start假设我们想查找英文时刻,像下面这样:8:05 am10:01 am12:50 pm3:09 pm我们该如何匹配这些时刻呢?有些人觉得非常简单,用下面的正则表达式:\d?\d:\d\d [ap]m这个正则表达式确实可以匹配上面的时刻,但它也可以匹配如 66:77 am 这样的无意义的时刻。事实上,我们在使用正则表达式的时候经常要在准确性和简单性之间原创 2012-04-29 09:34:57 · 896 阅读 · 0 评论 -
全局匹配模式
-- Start不区分大小写的匹配模式我们在忽略大小写匹配一节中介绍了如何在EmEditor中进行忽略大小写匹配,下面我们看一下如何在 Perl 和 Java中进行忽略大小写匹配。Perl 使用 /i 修饰符,Java 使用 Pattern.CASE_INSENSITIVE。#!/usr/bin/perlmy $testText = "I love regula原创 2012-05-02 21:17:37 · 3356 阅读 · 1 评论 -
字符组
-- Start我的英语很差,记性又不好,总是搞混 then 和 than,当我写完一篇英语文章,我想搜索一下这两个单词,看看有没有误用的情况,怎么办?虽然到目前为止你只学会了几个正则表达式元字符,但就解决这个问题来说已经足够了,在继续之前,停下来好好想想该用什么表达式来解决这个问题呢?在 EmEditor 中Ctrl+F 调出 Find 对话框,在 Find 中输入 then|tha原创 2012-04-20 20:43:06 · 1800 阅读 · 0 评论 -
字符转译序列
-- Start我们已经学习了好多正则表达式元字符,它们在正则表达式中有特殊的意义,而丧失了它们本来的意义。有时候我们只想匹配它本身,该怎么办呢? 如:我想匹配点号,可是在正则表达式中,点号代表任意单个字符,这时候我们只需要在点号的前面加反斜杠就 OK 了,如下:\.我们把这种形式称为转义。我们可以在任何元字符的前面加上反斜杠来匹配它自己。大家知道回车和换行原创 2012-04-23 22:32:43 · 2468 阅读 · 0 评论 -
字符组转译序列
-- Start还记得我们在字符组这一节中是如何匹配数字的吗? 对了, 是[0-9], 事实上如果你这样去匹配一个数字,别人可能要笑话你 out 了, 更常用的是\d,而且 \d 比前者更强大, 因为如果工具支持 Unicode,它还可以匹配中文全角数字,在 EmEditor 中试一试吧。有匹配数字的需求,当然肯定会有匹配非数字的需求,试一试 \D 吧。当然你也可以用 [^0-原创 2012-04-23 21:57:41 · 1554 阅读 · 1 评论 -
量词
-- Start我们已经学会了使用 \d 来匹配数字,如果我要匹配三个数字, 我可以写成 \d\d\d, 那如果我要匹配三十个数字,是不是要写三十个 \d 呢? 呵呵, 当然不用。试一试下面的表达式吧。\d{30}有时候,我们并不能确定有多少个数字,甚至有时候我们连有没有数字也无法确定,该怎么匹配呢?看看下面这个表格吧,我们把这些元字符称为量词(quantifiers).原创 2012-04-26 19:23:54 · 1436 阅读 · 0 评论 -
括号及后向引用
-- Start假设你有一个文件,其中包括两列,第一列是姓名,第二列是身份证号,中间用逗号分隔。现在让你把这两列调换一下顺序,也就是第一列是身份证号,第二列是姓名,该怎么办呢?我们可以先把逗号替换成 Tab 符, 然后把整个文件中的内容 copy 到 excel 中, 在 excel 中调换顺序后把内容 copy 回文件。 当然这种方法可行,只是有点笨了,试一试下面这种方法吧。在原创 2012-04-27 21:02:41 · 3683 阅读 · 1 评论 -
贪婪,非贪婪和占有量词的区别
-- Start我们在 量词 一节中介绍了什么量词以及贪婪与非贪婪量词之间的区别。事实上,通常正则表达式支持以下三种量词。贪婪量词非贪婪量词占有量词匹配X? X??X?+匹配X 0次或1次X* X*?X*+匹配X 0次或无数次X+ X+?X++匹配X 1次或无数次原创 2012-05-12 21:13:37 · 2163 阅读 · 0 评论 -
条件判断
-- Start正则表达式还支持简单的条件判断结构,格式如下:(?if then |else)其中的 if 部分是特殊的表达式,而 then 和 else 部分是普通的正则表达式,else 部分是可选的。1. if 部分可以测试捕获,下面是一个简单的例子。#!/usr/bin/perlmy $testText = "#test#";if($testText原创 2012-05-12 21:11:05 · 1045 阅读 · 0 评论 -
匹配的起始位置 \G
-- Start\G 通常应用于迭代操作中,它指示上次匹配的结束位置或本次匹配的开始位置。第一次迭代时,\G 匹配字符串的开始。如果在迭代的过程中正则表达式不能匹配成功,\G 会重新指向字符串的开始位置。但是如果我们指定了 Perl 的 /c 修饰符,那么即使正则表达式匹配失败了,\G 将不会重新设置。下面是一个简单的例子。#!/usr/bin/perlmy $testText =原创 2012-05-12 20:47:29 · 1944 阅读 · 0 评论 -
分组,捕获及后向引用
-- Start我们在 括号及后向引用 一节中了解到了括号的两种用途:分组和捕获。分组事实上,正在表达式还一共提供了三种结构用于分组,如下:元字符(Metacharacter) 匹配(Matches)(...) 分组(?:...) 分组(?>…) 固化分组 它们之间有什么区别呢? 我原创 2012-05-13 10:42:05 · 1681 阅读 · 0 评论 -
固化分组和占有量词
-- Start假设我们有这样的问题,把类似 3.690000023 的小数保留两位小数,类似 2.3563895 的小数保留三位小数,也就是说如果小数的第三位是 0, 则保留两位小数,如果是非 0, 就保留三位小数,该怎么呢? 这个问题比较简单,用下面的 Perl 代码。$number =~ s/(\.\d\d[1-9]?)\d*/$1/;这个表达式完全可以工作,美中不足的一点是,当原创 2012-05-25 20:10:55 · 2061 阅读 · 0 评论 -
去除首尾空白字符
-- Start在对文件进行操作的时候,我们经常需要去除文件中每一行的首尾空白字符,使用正则表达式,这是一个非常轻松的活,在 EmEditor 中试一试下面的表达式吧。^\s+|\s+$--更多参见:正则表达式精萃-- 声 明:转载请注明出处-- Last Updated on 2012-05-25-- Written by ShangBo on 2012-05-25原创 2012-05-25 21:26:14 · 2208 阅读 · 0 评论 -
去掉文件名中的路径
-- Start如何把一个文件名中的路径去掉呢? 如: /var/tmp/test.txt, 在EmEditor试一试下面的表达式吧。^.*/--更多参见:正则表达式精萃-- 声 明:转载请注明出处-- Last Updated on 2012-05-25-- Written by ShangBo on 2012-05-25-- End原创 2012-05-25 21:33:47 · 2837 阅读 · 0 评论 -
回溯
-- Start在上一节中我们了解了什么是回溯,通常量词和多选结构会引起回溯。假设用表达式 ^.*([0-9]+) 去匹配 "恋曲 1990",括号中会匹配什么呢?我们的本意是匹配 1990, 但是遗憾的是它只能匹配一个 0, 为什么会这样呢?因为星号是贪婪量词,.* 会一直匹配到字符串的结尾,为了使整个表达式能够匹配成功,引擎会进行回溯,吐出一个字符,之后再次尝试匹配整个表达式,此时匹配成功原创 2012-05-24 21:06:06 · 1357 阅读 · 1 评论 -
正则表达式的匹配原理
-- Start虽然支持正则表达式的工具有很多,但在这些工具的背后都是使用以下两种引擎之一来解析字符串。不同的引擎支持的元字符及工作原理是不同的,下面我们看看它们的工作原理。非确定型有穷自动机(NFA):表达式主导我们用表达式 reg(ress|ular) 匹配文本 I love regular expressions,NFA 引擎从表达式 r 开始,检查当前表达式 r 是否和原创 2012-05-21 21:43:28 · 4241 阅读 · 0 评论 -
正则表达式精萃
-- Start为了方便大家的阅读,本人已经将本系列文章做成 pdf 电子书,上传到 CSDN,爱问,百度文库,豆丁,欢迎大家下载。 正则表达式基础篇本篇的系列文章将带领大家走入正则表达式的世界,无论你是不是程序员,本篇的系列文章将会让你受益匪浅,一旦你掌握了正则表达式,你将会感叹当初没有正则表达式的日子是怎么过的。正则表达式简介匹配任何字符:点原创 2012-04-15 12:21:06 · 5590 阅读 · 4 评论 -
如何写出高效的正则表达式
-- Start有相当大的一部分程序员他们只考虑如何能尽快把活干完,从来不考虑如何使自己的代码更完美,更高效,这样的程序员永远也达不到一定的高度。当然,在写正则表达式的时候,我们首先要保证准确性,其次才是效率问题。下面是一些提高正则表达式效率的小窍门。尽量重用已编译的正则表达式在 Java 中使用正则表达式的时候我们需要先编译,所以应该尽量重用我们已经定义的正则表达式。优先使用非捕原创 2012-05-29 19:41:35 · 2368 阅读 · 0 评论 -
字符组集合运算
-- Start我们已经知道了什么是字符组,为了使定义字符组更加优雅便利,Java 的字符组支持完整的集合运算(并、补、交),来看下面的例子。[a-d[m-p]] 并集 等同于[a-dm-p][a-z&&[def]] 交集 匹配d, e 或 f[a-z&&[^bc]] 补集 等同于[ad-z]-原创 2012-05-10 21:10:46 · 1187 阅读 · 0 评论 -
局部匹配模式
-- Start在全局匹配模式 一节中我们了解到, 支持正则表达式的工具通常都支持以下几种模式。不区分大小写的匹配模式注释模式单行模式(点号通配模式)多行模式(增强的行锚点模式)文字文本模式但是它们的作用范围都是整个表达式,事实上我们还可以指定局部匹配模式,也就是说它们只对部分子表达式起作用。我们来看如何指定局部匹配模式。不区分大小写的匹配模式原创 2012-05-12 07:55:23 · 1681 阅读 · 0 评论 -
为数值添加逗号
-- Start假设现在你有一些像下面这样的数字,你想为它们从右到左每四位添加一个逗号,从而使它们可读性更好,该怎么办呢?1234567890也许你觉得,下面的办法可以解决问题:在 EmEditor 中Ctrl+H 调出Replace 对话框,在 Find 中输入(\d\d\d\d),在 Replace With 中输入\1,。不过遗憾的是结果变成了这个样子:1234,原创 2012-04-29 10:24:24 · 2707 阅读 · 0 评论 -
非贪婪匹配
-- Start我们接着上节的例子,你有一个文件,其中包括两列,第一列是姓名,第二列是身份证号,中间用逗号分隔。不同的是,姓名和身份证号都用双引号引起来。像下面这样:"尚波","1234567890"假设你想查找姓名这一列,用下面的表达式:^".*"然而结果并非像我们期望的那样匹配 "尚波",而是匹配了整行 "尚波","1234567890",这不是我们想要的。我们把星原创 2012-04-28 19:41:53 · 6613 阅读 · 1 评论 -
方言
-- Start我们的祖国那么大,每个地方都有自己的方言,虽然它们都称为汉语,但是和普通话还是有一定的差别的。事实上,正则表达式也有方言,在正则表达式简介一节中我们了解了一些支持正则表达式的工具,虽然它们都支持正则表达式,但是每样工具支持的元字符和其他特性是有细微差别的。在使用一样工具之前,你最好查看一下它的文档,了解一下它支持哪些元字符。如果你使用的是 EmEditor,打开 Hel原创 2012-04-29 08:51:25 · 1046 阅读 · 0 评论 -
忽略大小写匹配
-- Start我们在之前的例子中并没有考虑大小写的问题,事实上正则表达式本身是区分大小写的,为了匹配不区分大小写的 a,我们需要用正则表达式 [aA],这样就大大增加了正则表达式的复杂度,幸运的是每一种支持正则表达式的工具都提供了忽略大小写的匹配模式,如 EmEditor 默认的模式就是忽略大小写的匹配模式,你可以选中 Find 对话框中的 Match Case 来进行大小写匹配。原创 2012-04-30 19:03:49 · 3400 阅读 · 0 评论 -
匹配任何字符:点号(.)
-- Start假设现在让你把一个文件中的的英文句号(.)替换为中文句号(。),是不是很easy, 呵呵,在 EmEditor 中Ctrl+H 调出Replace对话框,在 Find 中输入英文句号(.),在 Replace With 中输入中文句号(。),然后轻轻点击 Replace Al l就搞定了。 我们按 Ctrl+Z 撤销我们刚才的替换,然后我们选中Replace 对话框中的原创 2012-04-18 20:13:22 · 62741 阅读 · 0 评论 -
单词分界符
-- Start假设你想在一个文件中搜索 hi,很不幸 hisoft (海辉软件)也被查出来了,可是我只想搜索单词hi,怎么办呢?试一试下面的表达式吧:\\ 匹配单词的开始,\> 匹配单词的结束,其实还有一个元字符也表示单词分界符,下面的表达式和上面是一个意思:\bhi\b既然有匹配单词边界的需求,当然也会有匹配非单词边界的需求,如果你想查找包含 hi 的单词,试一试下面的原创 2012-04-21 21:48:52 · 2971 阅读 · 0 评论 -
八进制转义
-- Start作为一名程序员,大家都应该知道什么是编码吧。呵呵,其实, 所谓的编码就是字符和数字之间的映射, 我们把这个数字称为代码点或码位。在正则表达式中,我们可以直接使用这个代码点,问题是如何知道一个字符的代码点呢? 呵呵, 很简单,用下面的 Java 代码,我们就可以很容易的知道字符 u 的八进制代码点是 165。System.out.println(Integer.toOct原创 2012-05-07 20:05:24 · 3461 阅读 · 0 评论 -
十六进制转义
-- Start在八进制转义一节中,我们知道了什么是代码点以及如何在正则表达式中使用八进制代码点。这一节,我们将学习如何在正则表达式中使用十六进制代码点,首先,我们必须知道如何查找一个字符的十六进制代码点。System.out.println(Integer.toHexString('u'));从上面的 Java 代码中,我们可以很容易的知道 u 的十六进制代码点是 75,下面我们看看原创 2012-05-07 20:30:35 · 5885 阅读 · 0 评论 -
控制字符
-- StartASCII 编码共定义了128个字符,其中前32位都是一些控制字符。我们已经知道了如何用 \n 来匹配换行符,除此之外,我们还可以使用 \cJ。#!/usr/bin/perlmy $testText = "I love reg\nular expressions.";if($testText =~ m/reg\cJular/) { print "finds原创 2012-05-07 21:57:48 · 2181 阅读 · 0 评论 -
正则表达式简介
-- Start1. 什么是正则表达式 (Regular Expressions)是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。有点拗口,呵呵,说白了就是用来描述字符串的字符串。更直白点说它就是一个字符串,呵呵,够直白吧,那它有什么用呢? good question。2. 正则表达式的作用用来对文本也就是字符串进行查找和替换。我估计有点电脑原创 2012-04-15 12:28:52 · 2080 阅读 · 2 评论 -
点号 vs 排除型字符组
-- Start我们已经知道了在正常情况下点号(.)是不能匹配换行符的,为了使点号能够匹配换行符,我们不得不使用工具提供的单行匹配模式。令人高兴的是,我们并非只有一种选择,通常排除型字符组是可以匹配换行符的,我们可以在需要点号匹配换行符的时候采用排除型字符组来替代。#!/usr/bin/perlmy $testText = "I love reg\nular expressions原创 2012-05-08 21:28:29 · 1198 阅读 · 0 评论 -
再论点号
-- Start我们已经知道了在正常情况下,点号(.)能够匹配除换行符以外的任何字符。事实上这句话并不准确,确切的说,点号(.)能够匹配除换行符以外的任何单个代码点。由于处于辅助平面内的字符由两个代码点构成,所以,为了匹配这些字符,我们需要两个点号。幸运的是,这些字符我们很少使用,基本上我们可以不考虑。看到这里,如果你此时的想法是 what the hell are you talking原创 2012-05-09 19:56:05 · 922 阅读 · 0 评论 -
POSIX 字符组
-- Start什么是 POSIX 呢? POSIX 是 Portable Operating System Interface (可移植操作系统接口) 的缩写,它是一系列标准,确保操作系统之间的移植性。通常支持正则表达式的工具都支持下列 POSIX 字符组。元字符(Metacharacter)匹配(Matches)[[:alnum:]]字母和数原创 2012-05-10 21:46:58 · 2185 阅读 · 0 评论 -
元字符终极总结
-- Start字符(Characters)元字符(Metacharacter)匹配(Matches)\aalert警报(\u0007)\eescape Escape字符(\u001B)\fform-feed进纸符(\u000C)\nnewline换行符(\u000A)\原创 2012-05-06 13:28:06 · 1871 阅读 · 0 评论 -
环视
-- Start假设让你在一个文件中查找一下 u 后面不是 x 的单词,怎么办? 一个很自然的想法是用下面的正则表达式来查找:u[^x]不过遗憾的是,你很可能漏掉了部分单词,啊? 是吗? 我怎么没看出问题来呢? 到底会漏掉什么样的单词呢? 呵呵,如果 you 这个单词出现在一行的末尾,试一试,你还能用这个表达式搜索出来吗? 记住排除型字符组的意思是匹配一个未列出的字符,而不是不要匹原创 2012-04-21 19:40:49 · 1677 阅读 · 0 评论 -
总结
-- Start恭喜你,你已经学完了基本篇的全部知识,下面是我们本篇学到的全部正则表达式元字符。你肯定对正则表达式有了一定的理解,遇到问题时,你也会想到用正则表达式能够解决这个问题,但是真正让你写正则表达式的时候,我想对你来说还是有困难的,如果你有这种感觉,那么正则表达式练习篇的系列文章正是为你准备的。你还在等什么呢?元字符 名称 匹配对象原创 2012-04-29 09:45:39 · 1045 阅读 · 1 评论 -
有些问题不一定要一次完成,有时候可以增加中间步骤
--start今天遇到一个说简单不简单,说难不难的问题,问题是这样的,有一个文件,格式如下:[quote]1109,2009/4/15,15:51,当社,その他,振込,"25万入金。(03)9月、10月分充当、(02)2月不足分、3月分、4月利息一部に充当 "442,2009/4/15,17:41,自宅,本人,電話架,"留守電に16日か17日のどちらに来社されるか絡くれと入れる。 "1...原创 2010-04-20 19:58:46 · 103 阅读 · 0 评论