[英]Regular expression help in 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。 猜猜我可以使用正則表達式
你可以捏造你不關心的東西來使表達變得更容易,比如使用非貪婪量詞的'glob'來表示括號(和電子郵件分隔符)之間的部分:
/(\d+)\).*?\(.*?\),\s*<.*?>\s*(\d+(?:,\s*\d+)*):/ (not tested!)
只有兩個被捕獲的組,(1234)和(1234,4657),第二個我只能從你的模式中假設:“一個數字字符串,后跟零個或多個逗號分隔的數字字符串”。
好吧,一個簡單的解決方法是只允許字符類中的所有可能字符。 也就是說改變\\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 }
}
當然,這假定您不能在該行的電子郵件部分前面添加<>
標簽。 它將捕獲在<>
標記和冒號之間找到的任何數字,逗號和空格,然后返回匹配中找到的任何數字的列表。 您也可以只返回字符串,如注釋行所示。
您的示例中似乎缺少某些內容。 這是他們應該看起來像電子郵件的樣子嗎?
(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+))?:
$string =~ /.*>\s*(.+):.+/;
$numbers = $1;
而已。 測試。
數字捕捉:
$string =~ /.*>\s*(?([0-9]|,)+):.+/;
$numbers = $1;
沒有經過測試,但你明白了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.