【问题标题】:Splitting Two Characters In a String - Perl拆分字符串中的两个字符 - Perl
【发布时间】:2014-08-06 09:51:16
【问题描述】:

我正在尝试拆分此字符串。代码如下:

 my $string = "585|487|314|1|1,651|365|302|1|1,585|487|314|1|1,651|365|302|1|1,656|432|289|1|1,136|206|327|1|1,585|487|314|1|1,651|365|302|1|1,585|487|314|1|1,651|365|302|1|1%656|432|289|1|1%136|206|327|1|1%654|404|411|1|1";
 my @ids = split(",", $string);

我想要的只是在字符串中拆分%,,有人告诉我可以使用这样的模式? /[^a-zA-Z0-9_]/

【问题讨论】:

  • perldoc -f 拆分。 split /[%,]/, ..
  • 完美运行!谢谢!
  • @mpapec 你为什么不发表你的评论作为答案?

标签: regex string perl split


【解决方案1】:

字符类可用于表示一组可能匹配的单个字符。并且字符类开头的^ 符号否定该类,表示“任何匹配除了...。”在split 的上下文中,任何匹配都被视为分隔符。

在这种情况下,`[^a-zA-Z0-9_] 将匹配除 ASCII 字母 'a' 到 'z'、'A' 到 'Z' 和数字数字 '0 之外的任何字符' 到 '9',加上下划线。在您的情况下,虽然这会正确拆分为“,”和“%”(因为它们不包含在 az、AZ、0-9 或 _ 中),但它也会错误地拆分为“|”,以及您尝试的角色类别中未包含的任何其他角色。

在您的情况下,具体说明要使用的分隔符以及使用否定类会更有意义;您想指定确切的定界符,而不是定界符不能指定的整个字符集。因此,正如 mpapec 在他的评论中所说,更好的选择是[%,]

所以你的解决方案应该是这样的:

my @ids = split/[%,]/, $string;

一旦您拆分 '%' 和 ',',您将得到一堆看起来像这样的子字符串:585|487|314|1|1(或这些数字的一些变体)。在每种情况下,它都是由“|”字符分隔的五个正整数。在我看来,您最终可能也想通过拆分“|”来分解这些内容。

您可以构建由列表列表表示的单个数据结构,其中每个顶级元素代表一个[,%] 分隔字段,并包含对由管道分隔字段组成的匿名数组的引用。以下代码将构建该结构:

my @ids = map { [ split /\|/, $_ ] } split /[%,]/, $string;

当它运行时,你最终会得到这样的结果:

@ids = ( 
    [ '585', '487', '314', '1', '1' ],
    [ '651', '365', '302', '1', '1' ],
    # ...
);

现在可以单独检查和操作 ID 中的每个字段。

要了解有关字符类如何工作的更多信息,您可以查看perlrequick,它对字符类有很好的介绍。有关split 的更多信息,请随时联系perldoc -f split(如mpaec 所述)。 split 也在 O'Reilly 书《Learning Perl,第 6 版》的第 9 章中进行了讨论。

【讨论】:

  • 非常详细的解释,+1 :)
猜你喜欢
  • 2013-07-07
  • 2012-07-30
  • 2010-09-27
  • 2018-01-06
  • 2013-11-08
  • 2012-10-13
  • 2011-06-14
  • 1970-01-01
  • 2016-04-14
相关资源
最近更新 更多