2013-02-14 23 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

相关问题