保持字符串的前2个部分带有分隔符

时间:2018-11-27 10:48:45

标签: regex string perl

是否存在以下更简洁/完善的方法:

<?php echo form_open('login/connect', array('class' => 'login-form')); ?>
-----------------------------
<?php echo form_close(); ?>

输入是最多2个my @components = split /-/, $original; my $final_string = $components[0]."-".$components[1]; 的字符串,最后一个是可选的。我一直想保留第一部分。即-应该变成10-9-1,而10-9应该保持10-9

4 个答案:

答案 0 :(得分:5)

use Modern::Perl;

my $re = qr/-\d+\K.*$/;
while(<DATA>) {
    chomp;
    s/$re//;
    say;
}
__DATA__
10-9-1
10-9

仅输入一个字符串:

my $original = '10-9-1';
(my $final = $original) =~ s/-\d+\K.*$//;
say $final;

外植:

s/
    -       # find the first dash in the string
    \d+     # 1 or more digits
    \K      # forget all we have seen until this posiiton
    .*      # rest of the line
    $       # end of line
//

答案 1 :(得分:4)

在这里使用正则表达式匹配会更容易。

my ($final_string) = $original =~ /^([^-]*-[^-]*)/;

如果您想就地进行更改,则替换效果很好。

$original =~ s/^[^-]*-[^-]*\K.*//s;

答案 2 :(得分:2)

$original =~ m/^([^\-]+\-[^\-]+)/ or warn "Unable to match regex in string: $original";
my $final_string = $1;

认为这将回答您的查询。它不受任何特定字符串的限制-连字符后的文字应为数字或其他任何字符。如果它也不匹配也会警告您。

假设$original变量只有一个要匹配的实例(从问题中的代码推断出)。

答案 3 :(得分:2)

您拥有的正则表达式解决方案可能是最好的方法,但是也可以使用split()join()来实现。

# You need this to use 'say()'
use feature 'say';

while (<DATA>) {
  chomp;

  say join '-', (split /-/)[0, 1];
}

__DATA__
10-9-1
10-9

(split /-/)[0, 1]将从split()返回的列表中获取列表的前两个元素。