隐秘的perl表达

时间:2012-09-10 18:12:06

标签: regex perl pdl

我在perl(实际上是PDL)程序中找到以下语句:

/\/([\w]+)$/i;

有人可以为我解码,这是perl编程的学徒吗?

6 个答案:

答案 0 :(得分:10)

当然,我会从内到外解释:

\w - 匹配可在单词中使用的single character(字母数字,加上'_')

[...] - 匹配within the brackets

中的单个字符

[\w] - 匹配单词中可以使用的单个字符(有点多余)

+ - 匹配前一个字符repeating as many times,但必须至少出现一次。

[\w]+ - 多次匹配一组单词字符。这会找到一个词。

(...) - grouping。记住这组字符以供日后使用。

([\w]+) - 匹配一个单词,并在以后记住它

$ - end-of-line。在一行的末尾匹配

([\w]+)$ - 匹配一行中的最后一个单词,并记住它以供日后使用

\/ - 一个斜杠字符'/'。它必须用反斜杠转义,因为斜杠是特殊的。

\/([\w]+)$ - 在斜线“/”后匹配一行中的最后一个单词,并记住该单词以供日后使用。这可能是从路径中获取目录/文件名。

/.../ - match语法

/.../i - 我的意思是case-insensitive

现在一起:

/\/([\w]+)$/i; - 匹配一行中的最后一个单词并记住它以供日后使用;这个词必须在斜线之后出现。基本上,从绝对路径中获取文件名。不区分大小写的部分无关紧要,\w已经匹配两种情况。

有关Perl正则表达式的更多详细信息,请访问:http://www.troubleshooters.com/codecorn/littperl/perlreg.htm

正如JRFerguson指出的那样,YAPE::Regex::Explain对于标记正则表达式和解释这些部分非常有用。

答案 1 :(得分:5)

您会发现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;

假设此脚本名为'rexplain',请执行:

$ ./rexplain '/\/([\w]+)$/i'

......获得:

The regular expression:

(?-imsx:/\/([\w]+)$/i)

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  /                        '/'
----------------------------------------------------------------------
  \/                       '/'
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    [\w]+                    any character of: word characters (a-z,
                             A-Z, 0-9, _) (1 or more times (matching
                             the most amount possible))
----------------------------------------------------------------------
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  /                        '/'
----------------------------------------------------------------------
  \/                       '/'
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    [\w]+                    any character of: word characters (a-z,
                             A-Z, 0-9, _) (1 or more times (matching
                             the most amount possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string
----------------------------------------------------------------------
  /i                       '/i'
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------

<强>更新

另见:https://stackoverflow.com/a/12359682/1015385。正如那里和模块的文档中所述:

  

不支持在Perl 5.6之后添加正则表达式语法,尤其是任何   5.10中添加了构造。

答案 2 :(得分:2)

/\/([\w]+)$/i;

它是一个正则表达式,如果它是一个完整的语句,它将应用于$_变量,如下所示:

$_ =~ /\/([\w]+)$/i;

它会查找斜杠\/,后跟字母数字字符串\w+,后跟行尾$。它还会捕获()字母数字字符串,该字符串最终位于变量$1中。最后的/i使它不区分大小写,在这种情况下没有效果。

答案 3 :(得分:2)

虽然它没有帮助&#34;解释&#34;一个正则表达式,一旦你有一个测试用例,Damian的新Regexp::Debugger是一个很酷的工具,用于观察匹配过程中实际发生的情况。安装它然后在命令行执行rxrx以启动调试器,然后键入/\/([\w]+)$/'/r'(例如),最后键入m以开始匹配。然后,您可以通过重复输入来逐步调试调试器。真的很酷!

答案 4 :(得分:0)

这是将$_与斜杠后跟一个或多个字符(不区分大小写)并将其存储在$1

$_ value     then     $1 value 
------------------------------
"/abcdes"     |       "abcdes"
"foo/bar2"    |       "bar2"
"foobar"      |       undef      # no slash so doesn't match

答案 5 :(得分:0)

Online Regex Analyzer值得一提。这是一个link来解释你的正则表达式的含义,并粘贴在这里作为记录。

序列:按顺序匹配以下所有内容

/                                                  (slash)
                                               --+
Repeat                                           | (in GroupNumber:1)
   AnyCharIn[ WordCharacter] one or more times   |
                                               --+
EndOfLine