这些正则表达式意味着什么?

时间:2011-12-07 16:59:41

标签: regex perl

我冒险在Perl中读取代码并找到以下正则表达式:

$str =~ s/(<.+?>)|(&\w+;)/ /gis; 
$str =~ /(\w+)/gis

我想知道这些代码代表什么。 任何人都可以帮助我吗?

5 个答案:

答案 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

这将用空格替换所有标记和编码元素,如&amp;&lt;

第二个人希望它至少留下一个字。

答案 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编码的字符,例如

 &nbsp; 
来自$ str的

但是有更好的方法可以使用CPAN模块来实现这一点。然后代码尝试匹配并捕获变量$ 1 $ str中的第一个单词。 例如:

perl -le '$str = "foo<br>&nbsp;bar<another\ntag>baz"; print $str; $str =~ s/(<.+?>)|(&\w+;)/ /gis; $str =~ /(\w+)/gis; print $str; print $1;'

打印:

foo<br>&nbsp;bar<another
tag>baz
foo  bar baz
foo