簡體   English   中英

Perl中的正則表達式幫助

[英]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

我希望文本>之后的上述文本中的數字12241234, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM