此正则表达式更改表达式中发生了什么
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-]+)|<.*?>|.
最后 .
匹配所有未匹配的剩余字符。
如果您在循环中使用 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。正则表达式是错误的工具。
下面的正则表达式有效,但谁能解释一下是如何实现的? 任何评论表示赞赏!谢谢!藜麦
什么是正则表达式“|”正在从 <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-]+)|<.*?>|.
最后 .
匹配所有未匹配的剩余字符。
如果您在循环中使用 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。正则表达式是错误的工具。