【问题标题】:How do I handle every ASCII character (including regex special characters) in a Perl regex?如何处理 Perl 正则表达式中的每个 ASCII 字符(包括正则表达式特殊字符)?
【发布时间】:2010-10-19 17:39:11
【问题描述】:

我在 Perl 中有以下代码:

if (index ($retval, $_[2]) != -1) {
    @fs = split ($_[2], $_[1]);

$_[2] 是分隔符变量,$_[1] 是可能存在分隔符的字符串。($_[0] 用在别处)您可能已经猜到这段代码在这些变量名的子程序中。

无论如何,关于我的问题,当我的分隔符是像 'a'':' 这样无害的东西时,代码的工作方式应该如此。然而,当它是由 Perl 正则表达式解析的东西时,比如 '\' 字符,那么它就不会像预期的那样工作。这是有道理的,因为在拆分函数中 Perl 会看到如下内容:

split (/\/, $_[1]); 

这对它来说毫无意义,因为它会想要这个:

split (/\//, $_[1]);

所以考虑到所有这些,我无法回答的问题是这样的:“我如何做到这一点,以便我放入 $_[2] 或所有 ASCII 字符的任何分隔符都被视为字符它应该是而不是被解释为别的东西?”

提前致谢,

罗伯特

【问题讨论】:

标签: regex perl ascii split csv


【解决方案1】:

您可以使用quotemeta 正确地转义$_[2],这样它就可以在正则表达式中工作而不会被破坏。应该这样做:

my $quoted = quotemeta $_[2];
@fs = split( $quoted, $_[1] );

或者,您可以在正则表达式中使用 \Q 来转义它。请参阅perlre 中的“转义序列”。

【讨论】:

  • 谢谢你,它工作得很好。问题解决了。为您打勾。
【解决方案2】:
split /\Q$_[2]/, $_[1]

【讨论】:

  • 你说得对,这是我可以做到的方法之一,但我的蜱虫必须去找另一个人,因为他的工作非常顺利。这产生了一个错误。
  • 没有“@fs =”也没有分号?这就是我能想到的(除了PEBKAC)。否则它和其他答案一样好。
  • 对不起,这是我的错,它工作得很好。但是,friedo 确实提供了更多信息和描述,所以我对选择他作为接受的答案并不感到难过;我很抱歉,但我会保留我的选择。 runrig:没有理由说PEBKAC;我显然是新人。
  • 我不是在抱怨选择“正确”答案,只是看看我的帖子是否需要更新 ;-)
【解决方案3】:

顺便说一句,我怀疑$_[1]$_[2] 变量是指自动传入的@_ 子数组。

这很有帮助 - 会为您节省很多解释,并使您的代码本身更易于理解 - 以及在 sub 开头使用类似以下内容的常见做法:

sub mysub {
  my ($param1, $string, $delim) = @_;
  # ...
}

【讨论】:

  • 谢谢,我应该考虑一下,但我对 Perl 还是很陌生,而且我发现我把它当作 C 来处理有点过分了。所以感谢您的提醒。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
相关资源
最近更新 更多