2013-02-14 49 views
2

我需要捕捉(")報價字符之間串來改變看中的人報價,因此我創建替代,我的代碼:爲什麼在我的正則表達式中,非單詞字符不匹配?

my $pk = qq|IV Baltic Sea NGO Forum "Challenges for Baltic Sea civil society"|; 
$pk =~ s/"(\p{Word}+.?+)"/«$1»/g; 
say $pk; 

我的意思是正則表達式爲:

  1. 報價焦炭
  2. 隨後在至少一個字炭
  3. 後跟任意炭
  4. 直到下一個引用字符(非貪婪捕獲)

當引號之間有任何非單詞字符時,我不會捕獲它。爲什麼?

我發現another solution也是,但我想明白,爲什麼我的正則表達式不起作用?

回答

4

.?+不是不情願的量詞。它實際上是一個所有格? quantifier

您需要改用.+?

所以,試試這個:

$pk =~ s/"(\p{Word}+.+?)"/«$1»/g; 

或者,你甚至可以用[^"]+而不是reluctant quantifier。它會自動停止在第一"字符:

$pk =~ s/"(\p{Word}+[^"]+)"/«$1»/g; 
+0

我不能記住有'+'或'+'和'='或'= .'。?。?。我應該檢查一下自己,謝謝你指點和提供其他方式!總之會接受它。 – 2013-02-14 08:22:55

+0

@ w.k。歡迎您:)關於'。='或'= .'沒有什麼特別的地方。正則表達式中只有3種量詞 - '*,+和?'。 – 2013-02-14 08:24:11

+0

@ w.k。默認情況下,這些quauntifiers是貪婪的,即它們儘可能匹配。所以,你在他們每個人的最後添加一個'?',以使他們不願意。另外,你在它們的最後加上一個'+'來使它們成爲所有格。與之匹配的字符串不會被回溯。 – 2013-02-14 08:25:25

相關問題