此正则表达式更改表达式中发生了什么

What is happening inside this regex alteration expression

下面的正则表达式有效,但谁能解释一下是如何实现的? 任何评论表示赞赏!谢谢!藜麦

什么是正则表达式“|”正在从 <script>Keep THIS</Script> 中剥离标签“”和“”以将 "Keep THIS" 放入内存 $1?

这是正则表达式:

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

这是字符串:

 <script>Keep THIS</Script>

结果:$1 = "Keep THIS"

评论如下:

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

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

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

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

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

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

DEMO

如果您在循环中使用 global 匹配,并且没有像您应该的那样放置 use warnings .

这就是我认为您拥有的内容,但是使用 Data::Dump 来显示 </code> 的内容,而不是您自己的代码中可能是 <code>print 的内容。 (它 真的 有助于显示您的 实际 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 ;
}

输出

undef
"K"
"e"
"e"
"p"
" "
"T"
"H"
"I"
"S"
undef
  • 第一遍匹配 <script>,未捕获,因此 </code> 未定义。</li> <li>后续传递匹配来自 class <code>[\w\.!?,\s-] 单个字符 ,它一次消耗字符串 Keep THIS 一个字符。
  • 最后,结束的 </Script> 被匹配而不捕获,并且再次留下 </code> 未定义。</li> </ul> <p><code>undef 打印为空字符串,如果没有启用 warnings,您将不会收到它的警报。

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