以下常规表现有效,但任何人都可以解释如何? 任何评论表示赞赏!谢谢!藜
什么是正则表达式&#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
答案 0 :(得分:1)
<.*?>
匹配所有标记,即匹配所有以<
开头并以>
结尾的字符串。然后,从剩余的字符串中,此([\w\.!?,\s-])
正则表达式将捕获所有单词字符或点或!
或?
或空格或逗号或连字符。请注意,它会将每个单个字符捕获到组1中。
如果要将整个字符串Keep THIS
捕获到组1中,则需要在字符类旁边添加+
量词。 +
重复前一个标记一次或多次。
([\w\.!?,\s-]+)|<.*?>|.
最后,.
匹配所有未匹配的剩余字符。
答案 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。正则表达式是这项工作的错误工具。