Perl中的正则表达式帮助

时间:2012-02-13 16:37:08

标签: regex perl

我有以下文字模式

(2222) First Last (ab-cd/ABC1), <first.last@site.domain.com> 1224: efadsfadsfdsf

(3333) First Last (abcd/ABC12), <first.last@site.domain.com> 1234, 4657: efadsfadsfdsf

我希望文字1224之后的上述文字中的数字1234, 4657>

我有这个 \((\d+)\)\s\w*\s\w*\s\(\w*\/\w+\d*\),\s<\w*\.\w*\@\w*\.domain.com>\s\d+: 这将采用:之前的文字但我希望通过电子邮件直到:

有没有简单的正则表达式来做到这一点?或者我应该使用split并执行此操作

由于

编辑:整个文本由命令行工具返回。

(3333) First Last (abcd/ABC12), <first.last@site.domain.com> 1234, 4657: efadsfadsfdsf

(3333) - 唯一ID

First Last - 名字和姓氏

<first.last@site.domain.com> - 格式为FirstName.LastName@sub.domain.com

的电子邮件地址

1234, 4567 - 数据库主键

: xxxx - 标题

我要做的是处理上面的内容并获取数据库ID(在ex:1234,4567 2中单独的ID)并查询表

以上是我通过Perl脚本调用的工具的输出(我会得到很多条目)。

我的想法是使用正则表达式来获取数据库ID。猜猜我可以使用正则表达式

4 个答案:

答案 0 :(得分:1)

你可以捏造你不关心的东西,使表达更容易,比如使用非贪婪的量词只是'glob'在括号(和电子邮件分隔符)之间的部分:

/(\d+)\).*?\(.*?\),\s*<.*?>\s*(\d+(?:,\s*\d+)*):/   (not tested!)

只有两个被捕获的组,(1234)和(1234,4657),第二个我只能从你的模式中假设:“一个数字字符串,后跟零个或多个逗号分隔的数字字符串”

答案 1 :(得分:1)

嗯,一个简单的解决方法是只允许字符类中的所有可能字符。也就是说将\d更改为[\d, ]以允许数字,逗号和空格。

您的正则表达式与第一个示例行不匹配,因为其中包含短划线-ab-cd/ABC1\w*\/\w+\d*\不匹配)。此外,过分依赖*量词不是一个好主意,因为它确实匹配空字符串(它匹配零次或多次),并且只应用于真正可选的事物。否则使用+,匹配(1次或多次)。

你有一个相当严格的正则表达式,并且像这样的数据略有变化,它将失败。只有你知道你的数据是什么样的,如果你确实需要一个严格的正则表达式。但是,如果您的数据有些一致,则可以使用松散的正则表达式,只需基于电子邮件部分:

sub extract_nums {
    my $string = shift;
    if ($string =~ /<[^>]*> *([\d, ]+):/) {
        return $1 =~ /\d+/g;   # return the extracted digits in a list
        # return $1;           # just return the string as-is
    } else { return undef }
}

当然,这假设您不能在该行的电子邮件部分前面添加<>标记。它将捕获<>标记和冒号之间的任何数字,逗号和空格,然后返回匹配中找到的任何数字的列表。您也可以只返回字符串,如注释行所示。

答案 2 :(得分:0)

您的示例中似乎缺少某些内容。这是他们应该看起来像电子邮件吗?

(1234) First Last (ab-cd/ABC1), <foo.bar@domain.com> 1224: efadsfadsfdsf

(1234) First Last (abcd/ABC12), <foo.bar@domain.com> 1234, 4657: efadsfadsfdsf

如果是这样,这应该有效:

\((\d+)\)\s\w*\s\w*\s\(\w*\/\w+\d*\),\s<\w*\.\w*\@\w*\.domain\.com>\s\d+(?:,\s(\d+))?:

答案 3 :(得分:0)

$string =~ /.*>\s*(.+):.+/;
$numbers = $1;

就是这样。 测试

号码捕捉:

$string =~ /.*>\s*(?([0-9]|,)+):.+/;
$numbers = $1;

未经测试,但您明白了。