Regex 您好,我需要一个正则表达式来匹配所有内容并转换为大写,perl中单引号内的文本除外

Regex 您好,我需要一个正则表达式来匹配所有内容并转换为大写,perl中单引号内的文本除外,regex,perl,Regex,Perl,假设我有这样一句话: anything but 'notthis' and also 'not this' and 'notthis' 我希望我的输出是: ANYTHING BUT 'notthis' AND ALSO 'not this' AND 'notthis' 任何帮助都将不胜感激 以下替代品有望对您有效: s/((?:'[^']*')*)([^']+)/$1\U$2/g; 括号组成行进组;第一个左括号创建了一个名为$1的反向引用,下一个是$2,等等。为了避免创建组,表单(:?是一

假设我有这样一句话:

anything but 'notthis' and also 'not this' and 'notthis'
我希望我的输出是:

ANYTHING BUT 'notthis' AND ALSO 'not this' AND 'notthis'

任何帮助都将不胜感激

以下替代品有望对您有效:

s/((?:'[^']*')*)([^']+)/$1\U$2/g;
括号组成行进组;第一个左括号创建了一个名为
$1
的反向引用,下一个是
$2
,等等。为了避免创建组,表单
(:?
是一个不创建反向引用的括号

第一组捕获并跳过单引号中的短语;它们在
$1
中被替换回原来的状态。该组可以匹配空字符串

第二组捕获一个不包含单引号的字符串。由于
+
重复运算符是贪婪的,因此它将匹配到下一个单引号或字符串结尾之前。它在替换中由
\U
转换为大写


/g
标志会重复尽可能多的次数,从上一场比赛结束的地方开始。

欢迎使用stackoverflow。一旦您尝试了一个示例,您将在帮助下获得更大的成功
my $string = "your string 'no upper case' sample";

my @arr = split/('.*?')/,$string;

foreach my $data(@arr)
{
    if($data !~ /'/)
    {
        $data = uc $data;
    }
    else
    {

    }
}


$string = join '',@arr;

print "$string";