我冒险在Perl中读取代码并找到以下正则表达式:
$str =~ s/(<.+?>)|(&\w+;)/ /gis;
$str =~ /(\w+)/gis
我想知道这些代码代表什么。 任何人都可以帮助我吗?
答案 0 :(得分:5)
第一个$str =~ s/(<.+?>)|(&\w+;)/ /gis;
进行了替换:
$str : the variable to work on
=~ : do the subs and save in the same variable
s : substitution operator
/ : begining or the regex
( : begining of captured group 1
< : <
.+? : one or more of any char NOT greedy
> : >
) : end of capture group 1
| : alternation
( : begining of captured group 2
& : &
\w+ : one or more word char ie: [a-zA-Z0-9_]
; : ;
) : end of group 2
/ : end of search part
: a space
/ : end of replace part
gis; : global, case insensitive, multi-line
这将用空格替换所有标记和编码元素,如&
或<
。
第二个人希望它至少留下一个字。
答案 1 :(得分:4)
帮助解密正则表达式的一种方法是使用CPAN中的YAPE :: Regex :: Explain模块:
#!/usr/bin/env perl
use YAPE::Regex::Explain;
#...may need to single quote $ARGV[0] for the shell...
print YAPE::Regex::Explain->new( $ARGV[0] )->explain;
假设此片段名为“explain”,您可以这样做:
$ ./rexplain 's/(<.+?>)|(&\w+;)/ /gis'
答案 2 :(得分:4)
第一个剥离每个XML / HTML标记和每个字符实体,用空格替换每个。第二个查找每个完全由单词字符组成的子字符串。
详细说明:
第一个表达式的第一部分首先匹配<
,然后匹配.
的任何字符(由于最后的/s
标志而包含换行符)。 +
修饰符会匹配>
中找到的最后一个$str
之前的一个或多个字符,但?
之后会使其不贪婪,因此它只匹配到遇到的第一个>
。第二部分匹配&
后跟任何单词字符,直到找到;
。由于;
不是单词字符,因此不需要?
修饰符。前面的s/
表示替换,第二个/
之后的位表示任何匹配替换的内容。最后的/gis
表示* g * reedy,case * i * nsensitive和* s * ingle line。
第二个表达式查找非单词字符的第一个子字符串,并将其放在$1
中。如果您反复调用它,最后的/g
表示它将继续匹配$str
中的每个实例。
答案 3 :(得分:3)
第一个采用字符串并用空格替换html标签或html字符代码
第二个确保完成后仍然有一个单词。
答案 4 :(得分:0)
这些“代码”是正则表达式。输入以了解更多信息:
perldoc perlre
上面的代码用空格替换了一些HTML / XML标记和一些URL编码的字符,例如
来自$ str的但是有更好的方法可以使用CPAN模块来实现这一点。然后代码尝试匹配并捕获变量$ 1 $ str中的第一个单词。 例如:
perl -le '$str = "foo<br> bar<another\ntag>baz"; print $str; $str =~ s/(<.+?>)|(&\w+;)/ /gis; $str =~ /(\w+)/gis; print $str; print $1;'
打印:
foo<br> bar<another
tag>baz
foo bar baz
foo