2017-04-19 61 views
1

我有一個下面的示例字符串,我想分割使用一些模式或括在括號或不。它們必須按照它們的位置順序分割,所以當我加入它們時,它們仍然是相同的。我的(@strArr)= $ str =〜/ ^(。*?)|((。*?)))$ /;Perl正則表達式可以按照它們的位置順序捕獲和拆分字符串嗎?

  1. ABC(DEF)GHI
    結果:ABC,(DEF),GHI

  2. ABC(DEF)GHI(JKL)
    結果:ABC,(DEF),GHI,(JKL )

  3. ABCDEF(GHI)
    結果:ABCDEF,(GHI)

  4. (ABC)
    結果:(ABC)

  5. (ABCD)EFG
    結果:(ABCD),EFG

使用的正則表達式的代碼只有一行這些是可能的?這些需要被存儲,以便@strArr

回答

3

您可以拆分與(\([^()]*\))模式字符串,將匹配(符號,然後是零個或多個不同於()的字符,然後是文字),並將捕獲匹配到組1中的整個子字符串所以Perl可以把它放到結果數組中。

的只有零下是,你需要刪除的空場比賽(與grep {/\S/}),但整體解決方案看起來相當的可讀性:

my $str = "abc(def)ghi"; 
my $regexp = qr/(\([^()]* \))/x; 
my @strArr = grep {/\S/} split /$regexp/, $str; 
print join(", ", @strArr); 

以上demo code的輸出:abc, (def), ghi

+0

謝謝!完美的作品,但我確實刪除了/ g修飾符,因爲我收到了警告消息:在extract_string.pl處使用/ g修飾符是毫無意義的 – criz

+0

@criz:確實,我忘記從匹配方法更改爲拆分後將其刪除一。 –

1

使用否定的字符類[^...]

my (@strArr) = $str =~ /[^\s(]+|\([^)]*\)/g; 

圖案的詳細資料:

/ 
[^\s(]+ # one or more characters that aren't opening round brackets or white-spaces 
|  # OR 
\(  # a literal opening round bracket 
[^)]*  # zero or more characters that aren't closing round brackets 
\)   # a literal closing round bracket 
/g # perform a global research 
+0

我喜歡你的答案,並且經過測試後效果很好。你能描述你的正則表達式模式的工作原理嗎? – criz

+0

@criz:我添加了模式的細節。 –

1

我嘗試了Wiktor和Casimir的例子。兩者都很好。

#!/usr/bin/perl 
use strict; 
use warnings; 

my %testHash = (
    '0' => '', 
    '1' => 'abc(def)ghi', 
    '2' => 'abc(def)ghi(jkl)', 
    '3' => 'abcdef(ghi)', 
    '4' => '(abc)', 
    '5' => '(abcd)efg' 
); 

# Solution 1 
print "By Wiktor:\n"; 
foreach my $key (sort keys %testHash) { 
    my $str = $testHash{$key}; 
    my $regexp = qr/(\([^()]* \))/x; 
    my @strArr = grep {/\S/} split /$regexp/, $str; 

    print "$str - ".join(", ", @strArr)."\n"; 
} 

# Solution 2 
print "\nBy Casimir:\n"; 
foreach my $key (sort keys %testHash) { 
    my $str = $testHash{$key}; 
    my (@strArr) = $str =~ /[^\s(]+|\([^)]*\)/g; 

    print "$str - ".join(", ", @strArr)."\n"; 
} 




By Wiktor: 
- 
abc(def)ghi - abc, (def), ghi 
abc(def)ghi(jkl) - abc, (def), ghi, (jkl) 
abcdef(ghi) - abcdef, (ghi) 
(abc) - (abc) 
(abcd)efg - (abcd), efg 

By Casimir: 
- 
abc(def)ghi - abc, (def), ghi 
abc(def)ghi(jkl) - abc, (def), ghi, (jkl) 
abcdef(ghi) - abcdef, (ghi) 
(abc) - (abc) 
(abcd)efg - (abcd), efg 
+0

我想對兩者都進行檢查,因爲兩種解決方案都可行。 Casimir的例子就是我所期待的,因爲它更簡單,但Wiktor的答案也很好。 – criz

相關問題