Featured image of post perl 兼容的正则表达式

perl 兼容的正则表达式

写一个脚本

grep -oP '<a\s+[^>]*>.*?</a>' *.html

说明:

-o:只输出匹配的部分。

-P:启用 Perl 兼容的正则表达式。

<a\s+[^>]*>.*?</a>:匹配 <a> 标签及其内容。

*.html:匹配当前目录下所有的 .html 文件。
grep -oP 'href="\K[^"]+' *.html

说明:

grep -oP:启用 Perl 兼容的正则表达式,并只输出匹配的部分。

href="\K[^"]+:

href=":匹配 href="。

\K:忽略前面的匹配内容。

[^"]+:匹配引号内的内容(直到下一个引号为止)。

*.html:匹配当前目录下所有的 .html 文件。

最终完成了一个脚本:


# 使用这个下载 koji 上面的 rpm 包
ljkoji() {
        curl -sS "$1" |grep -oP '<a\s+[^>]*>.*?</a>' |grep -oP 'href="\K[^"]+'|grep rpm |while read line;do wget $line;done
}
# 举例:ljkoji "http://10.30.38.131/koji/taskinfo?taskID=2827825" ,注意必须加引号

多行匹配

grep -P 支持多行匹配。

是的, Perl 兼容的正则表达式(PCRE,Perl Compatible Regular Expressions) 支持多行匹配。多行匹配是指正则表达式可以跨越多行文本进行匹配,通常用于处理包含换行符的文本。


1. 多行匹配的模式修饰符

在 Perl 兼容的正则表达式中,可以使用模式修饰符来启用多行匹配。常用的修饰符包括:

  • * m 修饰符*:
    • 启用多行模式(Multiline Mode)。
    • 在多行模式下, ^$ 分别匹配每一行的开头和结尾,而不是整个字符串的开头和结尾。
  • * s 修饰符*:
    • 启用单行模式(Single-line Mode)。
    • 在单行模式下, . 可以匹配换行符( \n )。

2. 多行匹配的示例

示例 1:使用 m 修饰符

假设有一个多行文本:

Line 1
Line 2
Line 3

使用 m 修饰符匹配每一行的开头:

/^Line \d+/gm
  • ^ :匹配每一行的开头。
  • Line \d+ :匹配 “Line” 后跟一个或多个数字。
  • g :全局匹配。
  • m :多行模式。

示例 2:使用 s 修饰符

假设有一个多行文本:

Start
Middle
End

使用 s 修饰符匹配整个文本:

/Start.*End/s
  • Start :匹配 “Start”。
  • .* :匹配任意字符(包括换行符)。
  • End :匹配 “End”。
  • s :单行模式。

3. 在 Shell 中使用 Perl 兼容的正则表达式

使用 grep -P

grep-P 选项支持 Perl 兼容的正则表达式。

示例:

echo -e "Line 1\nLine 2\nLine 3" | grep -P '^Line \d+'
  • 输出:
    Line 1
    Line 2
    Line 3
    

使用 perl

perl 命令可以直接使用 Perl 兼容的正则表达式。

示例:

echo -e "Start\nMiddle\nEnd" | perl -nle 'print if /Start.*End/s'
  • 输出:
    Start
    Middle
    End
    

4. 在编程语言中使用 Perl 兼容的正则表达式

在 Python 中使用 re 模块

Python 的 re 模块支持 Perl 兼容的正则表达式。

示例:

import re

text = "Start\nMiddle\nEnd"
pattern = re.compile(r'Start.*End', re.DOTALL)
match = pattern.search(text)
if match:
    print(match.group())
  • 输出:
    Start
    Middle
    End
    

在 PHP 中使用 preg 函数 {#在 =php= 中使用 =preg= 函数}

PHP 的 preg 函数支持 Perl 兼容的正则表达式。

示例:

$text = "Start\nMiddle\nEnd";
preg_match('/Start.*End/s', $text, $matches);
echo $matches[0];
  • 输出:
    Start
    Middle
    End
    

5. 总结

  • m 修饰符 :启用多行模式,=^= 和 $ 分别匹配每一行的开头和结尾。
  • s 修饰符 :启用单行模式,=.= 可以匹配换行符。
  • 在 Shell 中 :可以使用 grep -Pperl 命令。
  • 在编程语言中 :Python 的 re 模块和 PHP 的 preg 函数都支持 Perl兼容的正则表达式。

通过合理使用模式修饰符,可以实现多行文本的匹配和处理。