我有以下文字模式
(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。猜猜我可以使用正则表达式
答案 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;
未经测试,但您明白了。