Regex 如何更改嵌套引号?
我正在寻找一种方法来改变那些花哨的报价:Regex 如何更改嵌套引号?,regex,perl,Regex,Perl,我正在寻找一种方法来改变那些花哨的报价:“abc”->«abc» 它在简单的情况下对我有效,我正在寻找的下一步是如何让它也与嵌套引号一起工作:“abc”def“ghi”->«abc«def»ghi» $pk =~ s/ "( # first qoute, start capture [\p{Word}\.]+? # at least one word-char or point .*?\b[\.,?!]*
“abc”
->«abc»
它在简单的情况下对我有效,我正在寻找的下一步是如何让它也与嵌套引号一起工作:“abc”def“ghi”
->«abc«def»ghi»
$pk =~ s/
"( # first qoute, start capture
[\p{Word}\.]+? # at least one word-char or point
.*?\b[\.,?!]*? # any char followed boundary + opt. punctuation
)" # stop capture, ending quote
/«$1»/xg; # change to fancy
我希望regex能够匹配第一个和第三个报价,并对其进行更改。确实如此。问题是:我希望第二名和第四名能再次比赛,但不会,因为第二名已经落后了。一种解决方案是再次运行相同的替换,直到中的报价字符少于2个
有没有更好的方法来实现我的目标?当有第三层嵌套时,我的方法不起作用,这不是我的目标,我只使用两层
NB在单独的替换中更改startquote和enquote将不起作用,因为这样也将替换单双引号。我只需要在他们成对出现时才需要更换 更多示例:
"abc "d e f" -> «abc "d e f»
"abc"d e f" -> «abc"d e f»
这似乎是不可能的:
"abc" d e f" -> «abc" d e f»
没有通用的方法来配对嵌套的双引号。如果你的引号总是在一个词的开头或结尾旁边,那么这可能有效。它用开引号替换非空格字符前面的双引号,用闭引号替换非空格字符后面的双引号
use strict;
use warnings;
use utf8;
my $string = '"abc "d e f" ghi"';
$string =~ s/"(?=\S)/«/g;
$string =~ s/(?<=\S)"/»/g;
print $string;
没有通用的方法来配对嵌套的双引号。如果你的引号总是在一个词的开头或结尾旁边,那么这可能有效。它用开引号替换非空格字符前面的双引号,用闭引号替换非空格字符后面的双引号
use strict;
use warnings;
use utf8;
my $string = '"abc "d e f" ghi"';
$string =~ s/"(?=\S)/«/g;
$string =~ s/(?<=\S)"/»/g;
print $string;
您可以使用否定环顾断言来查找花式引号上的匹配方向。双重否定有助于处理边缘情况(例如,行的结束/开始)。为了简单起见,我使用了
,而不是您在这里的花哨引语
use strict;
use warnings;
while (<DATA>) {
s/(?<!\S)"(?!\s)/<</g;
s/(?<!\s)"(?!\S)/>>/g;
print;
}
__DATA__
"abc "d e f" ghi"
使用严格;
使用警告;
而(){
s/(?>/g;
打印
}
__资料__
“abc”d e f“ghi”
输出:
<<abc <<d e f>> ghi>>
您可以使用否定环顾断言来查找花式引号上的匹配方向。双否定有助于处理边缘情况(例如,行尾/行首)。为了简单起见,我使用了
而不是花式引号
use strict;
use warnings;
while (<DATA>) {
s/(?<!\S)"(?!\s)/<</g;
s/(?<!\s)"(?!\S)/>>/g;
print;
}
__DATA__
"abc "d e f" ghi"
使用严格;
使用警告;
而(){
s/(?>/g;
打印
}
__资料__
“abc”d e f“ghi”
输出:
<<abc <<d e f>> ghi>>
这是一个模棱两可的目标。为什么«abc»d e f«ghi»
不应该同样有效…?@deceze:因为引号与单词绑定,所以它们包含单词,引号内引号旁边没有空格。@w.k所以基本上,引号周围的空格是你奇特的引号应该指向的方向?@TLP:可能是空格或其他空格边界string@TLP:Cosider下一个标题:“游戏中有七棵树”玩家"这是一个模棱两可的目标。为什么«abc»def«ghi»
不应该同样有效…?@deceze:因为引号与单词绑定,所以它们包含单词,引号内引号旁边没有空格。@w.k所以基本上,引号周围的空格就是你奇特的引号应该指向的方向。@TLP:可能是空格或其他边界结束string@TLP:Cosider下一个标题:“游戏中有7名玩家”