String 递归地提取给定字符串中引号之间的字符串
给定一个在引号中包含子字符串的字符串,提取所有此类子字符串 我已经写了下面的代码,但有些东西告诉我它很难看(尽管它似乎确实起到了作用)String 递归地提取给定字符串中引号之间的字符串,string,perl,extract,quotes,String,Perl,Extract,Quotes,给定一个在引号中包含子字符串的字符串,提取所有此类子字符串 我已经写了下面的代码,但有些东西告诉我它很难看(尽管它似乎确实起到了作用) perl quotes.pl 地狱;世界 这是;也 因此,它确实如预期的那样工作。您可以在标量上下文中直接使用/gregex标志: while ($str =~ /"([^"]*)"/g) { print "$1\n"; } 。。。或列表上下文: for my $match ($str =~ /&qu
perl quotes.pl
地狱;世界
这是;也
因此,它确实如预期的那样工作。您可以在标量上下文中直接使用
/g
regex标志:
while ($str =~ /"([^"]*)"/g) {
print "$1\n";
}
。。。或列表上下文:
for my $match ($str =~ /"([^"]*)"/g) {
print "$match\n";
}
我还将*?
更改为[^”]*
,因为最好是具体说明要匹配的内容
/g
记录在:
/g
修饰符指定全局模式匹配——也就是说,在字符串中尽可能多地匹配。它的行为取决于上下文。在列表上下文中,它返回与正则表达式中任何捕获括号匹配的子字符串的列表。如果没有括号,它返回列表在所有匹配的字符串中,好像整个模式周围都有括号
在标量上下文中,每次执行m//g
都会找到下一个匹配项,如果匹配,则返回true,如果没有进一步的匹配,则返回false。可以使用pos()读取或设置上一个匹配项后的位置
函数;请参阅。失败的匹配通常会将搜索位置重置为字符串的开头,但您可以通过添加/c
修饰符(例如,m//gc
)来避免这种情况。修改目标字符串也会重置搜索位置
(Emphasis mine.)您可以在标量上下文中直接使用
/g
regex标志:
while ($str =~ /"([^"]*)"/g) {
print "$1\n";
}
…或列表上下文:
for my $match ($str =~ /"([^"]*)"/g) {
print "$match\n";
}
我还将*?
更改为[^”]*
,因为最好是具体说明要匹配的内容
/g
记录在:
/g
修饰符指定全局模式匹配——也就是说,在字符串中尽可能多地匹配。它的行为取决于上下文在列表上下文中,它返回由正则表达式中的任何捕获括号匹配的子字符串列表。如果没有括号,它将返回所有匹配字符串的列表,就像整个模式周围都有括号一样
在标量上下文中,每次执行m//g
都会找到下一个匹配项,如果匹配,则返回true,如果没有进一步的匹配,则返回false。可以使用pos()
函数读取或设置上一个匹配项后的位置;看见失败的匹配通常会将搜索位置重置为字符串的开头,但可以通过添加/c
修饰符(例如,m//gc
)来避免这种情况。修改目标字符串也会重置搜索位置
(我的重点。)子字符串是否可以有转义引号?例如,
'printf(“hello\'peter\”,…)
子字符串是否有转义引号?例如,'printf(“你好”“彼得”“,…)”