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. 后跟至少一个单词 char
  3. 后跟任何字符
  4. 直到下一个引用字符(非贪婪捕获)

当引号之间有任何非单词字符时,我不会被捕获。为什么?

我也找到了另一个解决方案,但我想了解,为什么我的正则表达式不起作用?

4

1 回答 1

4

.?+不是勉强量词。它实际上是一个所有格 ? quantifier

你需要.+?改用。

所以,试试这个:

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

或者,您甚至可以使用[^"]+而不是reluctant quantifier. 它将在第一个"字符处自动停止:

$pk =~ s/"(\p{Word}+[^"]+)"/«$1»/g;
于 2013-02-14T08:17:37.570 回答