0

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

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

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

4

6 回答 6

10

当然,我会从里到外解释它:

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

[...]- 匹配括号内的单个字符

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

+- 匹配前一个字符,尽可能多地重复,但必须至少出现一次。

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

(...)-分组。记住这组字符以备后用。

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

$-行尾。匹配行尾的东西

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

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

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

/.../-匹配语法

/.../i-i 表示不区分大小写

现在都在一起了:

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

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

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

于 2012-09-10T18:25:54.303 回答
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;

假设此脚本名为“reexplain”,请执行以下操作:

$ ./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 中添加的任何结构。

于 2012-09-10T19:07:04.520 回答
2
/\/([\w]+)$/i;

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

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

它查找斜线\/,后跟字母数字字符串\w+,然后是行尾$。它还捕获()以变量 . 结尾的字母数字字符串$1。最后/i的 使其不区分大小写,在这种情况下无效。

于 2012-09-10T18:17:10.907 回答
2

虽然它无助于“解释”正则表达式,但一旦你有了一个测试用例,Damian 的 newRegexp::Debugger是一个很酷的实用程序,可以观察匹配过程中实际发生的情况。安装它然后rxrx在命令行执行启动调试器,然后输入/\/([\w]+)$/'/r'(例如),最后m开始匹配。然后,您可以通过反复按 Enter 来逐步执行调试器。真的很酷!

于 2012-09-11T03:14:59.553 回答
0

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

$_ value     then     $1 value 
------------------------------
"/abcdes"     |       "abcdes"
"foo/bar2"    |       "bar2"
"foobar"      |       undef      # no slash so doesn't match
于 2012-09-10T18:22:09.170 回答
0

在线正则表达式分析器值​​得一提。这是一个解释您的正则表达式含义的链接,并粘贴在此处以供记录。

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

/                                                  (slash)
                                               --+
Repeat                                           | (in GroupNumber:1)
   AnyCharIn[ WordCharacter] one or more times   |
                                               --+
EndOfLine
于 2012-09-11T00:24:09.160 回答