通过正则表达式匹配不同的模式

时间:2017-07-19 07:15:23

标签: regex perl

我是regexp的初学者,我需要匹配以下内容:

Tab[0]hash/0-786541/value : 12

我尝试过很多东西,但是没有匹配。

例如:

^([\w\[\*\]]*[\w\/(0-9)\-(0-9){8})\/]\w)\s*:\s*

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

假设字符串需要由/:解析,这里有一些解析的基本方法

my $str = 'Tab[0]hash/0-786541/value : 12';

使用split

my @parts = split /\/|:/, $str;

字符串在/:上分开,因为split/.../内为其模式规范获取完整的正则表达式。我们还可以在匹配时清理大多数空格

my @parts = split /\s*(?:\/|:)\s*/, $str;

什么返回列表中的元素没有周围的空格(除了尾随空格,在字符串的末尾)。使用了non-capturing group (?:...),因为()也会捕获并返回分隔符。

使用正则表达式

my @parts = $str =~ m{ \s* ([^/:]+) \s* }gx;

匹配任何非/:的内容,一次或多次。 /g修饰符使其继续,直到字符串用尽,匹配模式的所有匹配项并返回()捕获的匹配列表。

我使用{}分隔符无需转义/,然后需要m{}。使用/x修饰符,我们可以自由地使用空格,换行符和注释(它们不匹配),以提高可读性。

然后我们可以分开数字

my @num = pop @parts;

两种情况。

这可以通过更具体的模式进行解析,但为此我们确实应该知道需要提取什么。一个人通常使用" landmark"字符串中的模式,能够形成精确的匹配目标,以及需要什么的知识,而不是指定每个元素。

如果显示的字符串代表文件中的典型行

use warnings;
use strict;

my $file = '...';
open my $fh, '<', $file or die "Can't open $file: $!";

while (<$fh>) 
{
    my @parts = m{\s*([^/:]+)\s*}g;    #/
    my $num = pop @parts;
    print "@parts -- $num\n";

    # Reassemble (up to extra spaces), perhaps for a check
    # my $orig_str = join('/', @parts) . " : $num";
}

#/仅用于通过标记关闭错误的语法高亮显示)

答案 1 :(得分:0)

 my $str = 'Tab[0]hash/0-786541/value : 12';

 if($str=~m{^(\w)*\[.*?\]([^\/]*)/([^\/]*)/([^\:]*)\s*\:\s*([^\d\w]*)\n?})
 {
      print "Matches...\n" 
 }

试试这个:

答案 2 :(得分:0)

您可以使用以下代码。

#!/usr/bin/perl

$str="Tab[0]hash/0-786541/value : 12";

        if ($str =~ /(\w)*\[(\d)\](\w)*\/(\d)-([0-8])*\/(\w)*(\s)\:(\d)*/)
        {
                print "matched\n";
        }
        else
        {
                print "not matched\n";
        }


(\w)*: [a-zA-Z] followed by zero\more times of [a-zA-Z]

\[   : \[ escape [ so that perl interpreter not to think it as start of charecter class

(\d) : followed bu any digit

\]   : \] escape ] so that perl interpreter not to think it as end of charecter class

(\w)*: [a-zA-Z] followed by zero\more times of [a-zA-Z]

\/   : escape / so that perl interpreter not to think it as end on regular expression

(\d) : followed by a digit [0-9]

 -   : followed by -

([0-8])*: followed by [0-8] (zero\more times)

\/   : escape / so that perl interpreter not to think it as end on regular expression

(\w)*: [a-zA-Z] followed by zero\more times of [a-zA-Z]

(\s) : followed by a space

\:   : followed by a colon

(\d)*: followed by digits [0-9] (zero\more times)