我是regexp的初学者,我需要匹配以下内容:
Tab[0]hash/0-786541/value : 12
我尝试过很多东西,但是没有匹配。
例如:
^([\w\[\*\]]*[\w\/(0-9)\-(0-9){8})\/]\w)\s*:\s*
感谢您的帮助
答案 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)