【问题标题】:perl pattern matching non-greedy match for stringperl 模式匹配字符串的非贪婪匹配
【发布时间】:2013-06-09 11:03:14
【问题描述】:

我有一个类似于ascv/zxc/zxc-asd/zx.java 的字符串,现在我希望在第二个/ 处剪切字符串并将字符串值设为ascv/zxc

同样我会输入特殊字符类型及其级别。根据输入,它应该剪切字符串。例如。从第一次匹配字符-;或/的第三场比赛

非常感谢任何帮助。

【问题讨论】:

  • SO 不是代码编写服务。您是否愿意分享您尝试过的东西,为什么它不起作用?见how to ask
  • 我试过了:- $a="ascv/zxc/zxc-asd/zx.java", ($str1,$str2)=split(/\//,$a);输出应该是 ascv/zxc 而不是 ascv,zxc
  • 有几种方法可以做到这一点,split 可能是最简单的。刚刚看到您的评论编辑:使用join 将它们粘在一起。

标签: string perl design-patterns matching greedy


【解决方案1】:

怎么样:

my $str = 'ascv/zxc/zxc-asd/zx.java';
$str =~ s#^([^/]+/[^/]+).*#$1#;
say $str;

输出:

ascv/zxc

【讨论】:

  • 谢谢,但它可以变化到我需要匹配的级别,它可以匹配第一个特殊字符(/)或匹配第 4 个,它由参数给出。实例 - 在第 3 个“/”之前剪切一个字符串匹配,在“/”的第 5 次匹配之前剪切一个字符串
【解决方案2】:

这应该对你有帮助。

use strict;
use warnings;
use 5.010;

my $str = 'ascv/zxc/zxc-asd/zx.java';

say truncate_at($str, '/', 1);
say truncate_at($str, '/', 2);
say truncate_at($str, '/', 3);
say truncate_at($str, '/', 4);
say truncate_at($str, '-', 1);

sub truncate_at {

  my ($str, $sep, $n) = @_;
  my @offsets;

  push @offsets, $-[0] while $str =~ m|\Q$sep|g;
  substr($str, $offsets[$n-1]) = '' if $n <= @offsets;

  $str;
}

输出

ascv
ascv/zxc
ascv/zxc/zxc-asd
ascv/zxc/zxc-asd/zx.java
ascv/zxc/zxc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2013-08-25
    • 1970-01-01
    • 2012-01-05
    • 2012-11-17
    相关资源
    最近更新 更多