Perl regex 快速入门

[TOC]

Perl 正则表达式 快速入门

Simple word matching

简单的字符匹配

  • 最简单的正则表达式就是一个字符,或者字符串的匹配。 举个例子:

说明:

右边的 World 是一个正则表达式,双斜杠//作为分隔符 ,将正则表达式包含进去/World/,告诉perl 这是要匹配的内容。

中间的=~is the operator testing a regular expression match. 是联系字符串 和 正则表达式 的 运算符。

如果匹配的话,产生一个 真 值,否则 false 。

左边的 可以是变量,可以是常量,就是你要跟 正则表达式 来进行匹配的。

在这例子中,World 匹配"Hello World"中第二个单词,所以表达式返回 true。

  • 除了 =~,还可用 !~表示逆向操作。
  • 正则表达式也可以用变量 替换
  • 如果 要与 $_匹配的话,$_ =~可以被省略
  • // 分隔符可以用 m 进行改变
  • 正则表达式必须完整的匹配 ,也就是说 右边是 左边的真子集。
  • perl 总是匹配最先出现的字符

元字符

  • 不是所有的字符都可以作为 as is 来进行匹配,例如元字符。

代码 说明 在字符集可以代表
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字 [0-9a-zA-Z_]
\s 匹配任意的空白符 [\ \t\r\n\f]
\d 匹配数字 [0-9]
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
  • 当匹配元字符时 需要加反斜杠\,进行转义。
  • 在正则表达式中也可以用转义序列 来匹配那些无法打印的 ASCII 字符。
    • \t for tab
    • \n for newline
    • \r for a carriage return
    • Arbitrary bytes are represented by octal escape sequences, e.g., \033 ,
    • hexadecimal escape sequences, e.g., \x1B :

  • 正则表达式大多是双引号内的字符串,所以变量也可以替换
  • 前边所有的正则表达式,都是匹配从任意位置开始,儿我们可以限定从开始,或者结尾进行匹配。
    • The anchor ^ means match at the beginning of the string and the anchor
    • $ means match at the end of the string, or before a newline at the end of the string.
    • ^从字符串开始位置进行匹配
    • $从字符串结束位置进行匹配,或者在 /n新行之前

使用字符类 using character classes

  • 字符类允许所有可能的字符集,不仅仅是单个字符来与正则表达式进行匹配字符类用中括号标记[…],字符集中所有字符都有匹配的可能。

说明:第三个,即使c是字符集里的第一个字符,但是根据最先匹配原则,与正则表达式匹配的是 a

还有字符集之间可以自由组合

说明: 最后的例子中 i 表示 case-insensitive,换句话说,是不区分大小写。

  • 字符集中既可以包含普通字符也可以有特殊字符,同样这些特殊字符-]\^$也需要转义。
  • 特殊字符-作为范围符号经常使用
    • [0-9] 表示[0123456789]
    • [a-z] 表示[abc…xyz]

    注意:如果-在第一位置或者最后的位置,把它当做普通字符使用。

  • 特殊字符^在字符集中第一个位置,表示 非 或 取反的意思,否则的话,当做普通字符使用。

  • 反斜杠序列 Backslash sequences

    举个例子说明

  • 元字符\b,只匹配一个位置,不匹配字符,可以作为字符与非字符的边界\w\W或者\W\w

  • 对于自然语言的处理,经常使用 \b{wb}

或操作 Matching this or that

我们可以匹配不同的字符串 通过|或操作符。例如

​ 为了匹配 cat或者dog,我们可以把震泽表达式写成cat|dog。在之前,Perl 总将正则表达式 和字符串最早出现的可能的点进行匹配。

eg.

说明:

尽管在第二个正则表达式中,dog 在 cat 之前,但是要匹配的字符串中,cat出现的最早,所以匹配cat。

eg.

原理同上,第一个允许正则表达式中c匹配成功,那么正则表达式匹配成功。像或操作一样,有一个为真,则整个为真。第二个,所有的都匹配,那么所以第一个匹配。

At a given character position, the first alternative that allows the regex match to succeed will be the one that matches. Here, all the alternatives match at the first string position, so the first matches.

分组与分层匹配

Grouping things and hierarchical matching

我们可以用()来进行分组,讲括号内的正则表达式的一部分。

eg.house(cat|dog)表示 house 后跟的不是cat,就是dog。

提取匹配 Extracting matches

我们也可以用() 提取已匹配的字符串的各个部分。对于每个分组,我们可以用特殊变量$1,$2来保存各个要提取的部分。

再这个正则表达式中,我们用括号将他们进行了分组,然后通过变量$1,$2,$3将他们提取出来。我们也可以改写成

  • 嵌套我们根据左括号进行排序,然后根据括号配对。
  • 反向引用我们可通过反向引用 \g1,\g2, 将匹配的变量用在正则表达式内。

    $1,$2,…主要用于正则表达式外部, \g1,\g2用于正则表达式。

重复匹配 Matching repetitions

  • 常用限定符
代码/语法 说明
* 重复0次或更多次
+ 重复1次或更多次
? 重复0次或1次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

eg.

  • a? = match ‘a’ 1 or 0 times
  • a* = match ‘a’ 0 or more times, i.e., any number of times
  • a+ = match ‘a’ 1 or more times, i.e., at least once
  • a{n,m} = match at least n times, but not more than m times.
  • a{n,} = match at least n or more times
  • a{n} = match exactly n times

第一个(.*)匹配尽可能多的字符。

第二个(.*)只匹配了0次。

匹配多次 More matching

我们通常的匹配都是匹配一次,成功即返回,而还可以用//g匹配多次

eg

在标量上下文中,连续匹配多次需要用//g从一次匹配跳到另一次匹配,我们可以利用pos()设置位置,来定位追踪字符串的位置。

eg

打印结果

匹配失败或改变目标字符串会重置字符位置,如果你不想在匹配失败后让位置被重置,那么加上//c字符。

形如 /regex/gc

在 list 上下文中,//g可以返回 分组的一个列表,如果没有分组的话,这个list 匹配整个正则表达式

搜索和替换 Search and replace

查找和替换我们通过 s/regex/replacement/modifiers.

replacement 是一个在Perl中双引号字符串,如果这个字符串匹配正则表达式,那么就用其替换。

我们依然使用=~来作为运算符。If matching against $_ , the $_ =~ can be dropped。如果匹配不成功,我们就将其丢弃掉。如果匹配成功,我们就将其替换,否则返回false。

eg

说明:With the s/// operator, the matched variables $1 , $2 , etc. are immediately available for use in the replacement expression.匹配成功,立即生效

  • 全部替换我们同样可以用s///g来进行多次替换,应该是全部替换。

eg

  • 无损替换

我们可以使用s///r在进行替换时,返回替换的结果而不是被修改默认变量$_

eg

  • 替换评估 再操作

我们用 s///e来实现一个评估eval{...}从替换的字符串和评估结果里进行打包,然后替换子串。

改变原来字符串的内容。

eg

分离字符 The split operator

split /regex/,string,将string 分离成一个l含有多个子串的list ,返回值是一个list。

eg

或者将 ,一些数 进行分离

eg

如果字符串中包含//,我们要通过 m 修改替代 //

eg

Since the first character of $x matched the regex, split prepended an empty initial element to the list.

发表评论

电子邮件地址不会被公开。 必填项已用*标注