允许所有特殊字符的Perl正则表达式

时间:2015-10-15 11:09:53

标签: perl pcre

我正在使用的环境是PCRE,它支持Perl语法。

我想构建一个支持所有字符和特殊字符的正则表达式。

我试过了

  (.*)

但它不起作用。

例如。我正在尝试重定向

https://oldaddress.com/select.do?cyuf=err%3Errt.com%3fsfds%4A222-3424234&p=66&j=8 

https://newsite.com/select.do?cyuf=err%3Errt.com%3fsfds%4A222-3424234&p=66&j=8  

旧网站oldaddress.com已成功重定向至newsite.com,但URI部分select.do?cyuf=err%3Errt.com%3fsfds%4A222-3424234&p=66&j=8未保留在其中。

我使用regEx =~ (^.*)来处理URI部分,但正则表达式不支持所有特殊字符。

我想在Perl中实现这个regEx。

1 个答案:

答案 0 :(得分:3)

你的问题几乎肯定不是你的正则表达式。查询参数不会发生变化,因此它们不应该包含在正则表达式中,因为此Perl代码将演示:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

my $url = 'https://oldaddress.com/select.do?cyuf=err%3Errt.com%3fsfds%4A222-3424234&p=66&j=8';

my $new_url = 'https://newsite.com/select.do?cyuf=err%3Errt.com%3fsfds%4A222-3424234&p=66&j=8';

$url =~ s/oldaddress/newsite/;

if ($url eq $new_url) {
  say "Looks like that worked";
} else {
  say "Looks like you've got a problem";
}

我只更改域名,因此我需要在正则表达式中引用。

如果您的查询字符串没有在转换中幸存,那么该问题可归结为您正在使用的技术中的其他一些问题。如果不了解您正在做的事情,我们真的无法提供更多帮助。

更新:来自Sawyer的评论

  

但如何处理特殊字符?,%使用Perl使用Rege

你好像在看人们告诉你的事情。

  1. 你的正则表达式不需要处理?,%或其他特殊字符。您的正则表达式只需要处理正在更改的字符串中的位 - 这是域名,并且它们不包含这些字符。

  2. %在Perl正则表达式中没有特殊含义。

  3. ?具有特殊含义,您可以通过反斜杠来避免它(因此请使用\?)。

  4. Perl正则表达式中的点(.)匹配除了换行符之外的任何字符。它与?%匹配,没有任何问题。

  5. 你的问题不在于你的正则表达式;它是你系统中的其他地方。但是因为你对你正在做的事以及你是如何做到这一点如此神秘,我们真的无法提供帮助。

    Update2 :这是我的程序的另一个版本,演示(.*)匹配?%。但我不能强调你不需要这样做

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use 5.010;
    
    my $url = 'https://oldaddress.com/select.do?cyuf=err%3Errt.com%3fsfds%4A222-3424234&p=66&j=8';
    
    my $new_url = 'https://newsite.com/select.do?cyuf=err%3Errt.com%3fsfds%4A222-3424234&p=66&j=8';
    
    $url =~ s/(.*)oldaddress(.)/${1}newsite${2}/;
    
    if ($url eq $new_url) {
      say "Looks like that worked";
    } else {
      say "Looks like you've got a problem";
    }