这个正则表达式改变表达式内发生了什么

时间:2015-03-03 00:57:43

标签: regex perl pipe strip

以下常规表现有效,但任何人都可以解释如何? 任何评论表示赞赏!谢谢!藜

什么是正则表达式&#34; |&#34;做剥离标签&#34;&#34;和&#34;&#34;从<script>Keep THIS</Script>获取"Keep THIS"到内存$ 1?

这是REGEX:

(?x)
([\w\.!?,\s-])|<.*?>|.

这是字符串:

 <script>Keep THIS</Script>

结果:$ 1 =&#34;保持这个&#34;

评论如下:

  (?x)                     set flags for this block (disregarding
                           whitespace and comments) (case-sensitive)
                           (with ^ and $ matching normally) (with .
                           not matching \n)

  (                        group and capture to \1:
    [\w\.!?,\s-]             any character of: word characters (a-z,
                             A-Z, 0-9, _), '\.', '!', '?', ',',
                             whitespace (\n, \r, \t, \f, and " "), '-
                             '
  )                        end of \1
 |                        OR
  <                        '<'
  .?                       any character except \n (optional
                           (matching the most amount possible))
  >                        '>'
 |                        OR
  .                        any character except \n

2 个答案:

答案 0 :(得分:1)

<.*?>匹配所有标记,即匹配所有以<开头并以>结尾的字符串。然后,从剩余的字符串中,此([\w\.!?,\s-])正则表达式将捕获所有单词字符或点或!?或空格或逗号或连字符。请注意,它会将每个单个字符捕获到组1中。

如果要将整个字符串Keep THIS捕获到组1中,则需要在字符类旁边添加+量词。 +重复前一个标记一次或多次。

([\w\.!?,\s-]+)|<.*?>|.

最后,.匹配所有未匹配的剩余字符。

DEMO

答案 1 :(得分:0)

如果您在循环中使用全局匹配,并且没有按照您应该使用use warnings,那么这就是您所说的唯一方法。

以下是我认为您拥有的内容,但使用Data::Dump显示$1的内容,而不是您自己的代码中可能print $1的内容。 (真的有助于显示您的实际 Perl代码而非选定的代码段。)

use strict;
use warnings;

use Data::Dump;

my $s = '<script>Keep THIS</Script>';

my $re = qr/(?x)
([\w\.!?,\s-])|<.*?>|./;

while ( $s =~ /$re/g ) {
  dd $1;
}

<强>输出

undef
"K"
"e"
"e"
"p"
" "
"T"
"H"
"I"
"S"
undef
  • 第一个匹配<script>,未捕获,因此$1未定义。
  • 后续传递匹配来自类[\w\.!?,\s-]单个字符,它一次消耗一个字符Keep THIS字符串。
  • 最后,结束</Script>匹配而不捕获,并再次定义$1

undef打印为空字符串,如果未启用warnings,则不会向您发出警告。

解决方案是始终使用一个poper HTML解析器来处理HTML。正则表达式是这项工作的错误工具。