2015-12-02 157 views
3

我在Perl中編寫腳本,需要從文本文件中提取一些信息。在Perl中匹配最後一個正則表達式模式

這就是我的代碼的樣子 - 字符串值組成,但代表所有可能的字符串變體。

my @alpha = ("abcdefgh(i) jklmno(pqrs3), uvwxyz", 
      "abcdefghi jklmn(opq1st), uvwxyz", 
      "abcdefghi jklmn(o_q(1s3)), uvwxyz", 
      "abcdef(gh)i jklmno(pq(1s3)), uvwxyz"); 

foreach my $line (@alpha){ 
    if ($line =~ /\((.*\(?.*\)?)\),/){ 
    print $1 
    } 
} 

我想捕獲最後一組括號(或括號中英文爲英式英語的人)之間的大文本。
請注意我使用「點」運算符,因爲我想匹配任何內容,文本,數字或其他特殊字符。

基本上我想打印出來:

pqrs3 
opq1st 
o_q(1s3) 
pq(1s3) 

但我不斷收到:

(i) jklmno(pqrs3) <-- not ok 
opq1st <-- this is ok 
opq(1s3) <-- this is also ok 
gh)i jklmno(pq(1s3) <-- not ok 

我在做什麼錯?或者甚至有可能以這種方式匹配?
任何幫助表示讚賞。

+0

你總是希望_Last outer_比賽?您可能需要在這裏使用解析器。看看[這篇文章](http://stackoverflow.com/questions/133601/can-regular-expressions-be-used-to-match-nested-patterns)。 –

+0

是的,我不需要一條正則表達式。我確實試圖在第一個括號和最後一個之間取得所有內容,但這並不奏效。 – Sid5427

+0

還有一個問題:你知道有多少個括號組?在你的例子中,它似乎在1-2之間變化。 –

回答

2
(\((?:[^()]|(?1))*\))(?!.*\() 

您可以在這裏使用recursive正則表達式。

https://regex101.com/r/hE4jH0/21

+0

這是我見過的最正宗的正則表達式之一。謝謝。 我想regex101鏈接也有表達式的描述? – Sid5427

+0

@ Sid5427是的,它有:) – vks

+0

我有點困惑在這裏...我試圖擺脫外括號.. (pq(1s3))至pq(1s3)... – Sid5427

2

這裏是給定的字符串的方式:

use warnings; 
use strict; 

my @alpha = ("abcdefgh(i) jklmno(pqrs3), uvwxyz", 
      "abcdefghi jklmn(opq1st), uvwxyz", 
      "abcdefghi jklmn(o_q(1s3)), uvwxyz", 
      "abcdef(gh)i jklmno(pq(1s3)), uvwxyz"); 

foreach my $line (@alpha) 
{ 
    if ($line =~ m/.*\s+\w+\((.*)\),\s+\w+/) 
    { 
     print $1, "\n"; 
    } 
} 

輸出:

pqrs3 
opq1st 
o_q(1s3) 
pq(1s3) 
+0

您用作錨點的間距可能不是OP想要的。 – Miller

+0

@米勒是對的 - 我不打算用間距作爲錨點,但現在看它 - 它看起來也是一個很好的選擇。 – Sid5427