捕获特殊字符后的部分以及perl中的字符串

时间:2017-06-13 08:54:32

标签: regex perl

我有以下字符串:

"analysis": {
          "analyzer": {
            "case_insensitive": {
              "filter": [
                "lowercase"
              ],
              "tokenizer": "keyword"
            }
          }
        }

我需要从字符串中提取abc.t部分。我尝试了下面的正则表达式,只得到了abc。变量$ 1中的部分。

$string = 'perl/abc.t wstat[0]';

这将$ 1作为'abc'。 正则表达式的新手。

2 个答案:

答案 0 :(得分:2)

您声明\S两次意味着它应匹配两个非空格字符(最小可能匹配)。所以你的正则表达式不能考虑.t所以你的正则表达式应该是

Demo

perl\/(\S+)\s+

Demo

perl\/([^\s]+)

debugger  请参阅步骤12 13

对于您的第一个\S+abc.t匹配(步骤12)。

然后你提到另一个\S+。因此,您的RegEx涉及backtracking以匹配另一个非空白字符(步骤13)。

答案 1 :(得分:1)

查看输入字符串:

'perl/abc.t wstat[0]';
           ▲
           └────────➔ That's a space

您的模式为^.*perl\/(\S+)\S+}:也就是说,您希望在perl/之后一个接一个地找到两个 - 空格字符的跨度(顺便说一下,如果你只是想从头开始寻找“除换行之外的任意数量字符的范围”,你可能不需要锚定模式。)

perl/之后贪婪地满足两个跨度非空格字符的要求的唯一方法是将字符序列abc.(所有非空格)放入第一个跨度,并将最后剩下的字符t放在第二个。

use strict;
use warnings;

my $string = 'perl/abc.t wstat[0]';

if ( $string =~ m{ perl/ (\S+) }x ) {
    print "Basename is '$1'\n";
}

use re 'debug'use re 'debugcolor'以获取有关程序中正则表达式的更多详细信息。在这种情况下,请注意:

Compiling REx " ^.* perl/ (\S+) "
Final program:
   1: SBOL /^/ (2)
   2: STAR (4)
   3:   REG_ANY (0)
   4: EXACT <perl/> (7)
   7: OPEN1 (9)
   9:   PLUS (11)
  10:     NPOSIXD[\s] (0)
  11: CLOSE1 (13)
  13: END (0)

Compiling REx " perl/ (\S+) "
Final program:
   1: EXACT <perl/> (4)
   4: OPEN1 (6)
   6:   PLUS (8)
   7:     NPOSIXD[\s] (0)
   8: CLOSE1 (10)
  10: END (0)

如果这太复杂了,还有YAPE::Regex::Explain

C:\Temp> perl -MYAPE::Regex::Explain -e "print YAPE::Regex::Explain->new(qr{perl/(\S+)\S+})->explain"
The regular expression:

(?-imsx:perl/(\S+)\S+)

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):
----------------------------------------------------------------------
  perl/                    'perl/'
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    \S+                      non-whitespace (all but \n, \r, \t, \f,
                             and " ") (1 or more times (matching the
                             most amount possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
  \S+                      non-whitespace (all but \n, \r, \t, \f,
                           and " ") (1 or more times (matching the
                           most amount possible))
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------