Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何更改嵌套引号?_Regex_Perl - Fatal编程技术网

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名玩家”