模式首例的正则表达式匹配Perl

时间:2019-08-25 09:59:02

标签: perl

我有多个具有以下格式字符串的变量:

some_text_here__what__i__want_here__andthen_some

我希望能够将第一个变量的what__i__want_here部分分配给一个变量。换句话说,第一个双下划线之后的所有内容。字符串的其余部分可能会有双下划线,但是我只想在第一对下划线之后加上文字。

例如。

如果我有$var = "some_text_here__what__i__want_here__andthen_some",我只想将第二部分分配给新变量,例如$var2 = "what__i__want_here__andthen_some"

我不太擅长匹配,因此我不太确定该怎么做,因此仅在第一个双下划线之后才占用所有内容。

3 个答案:

答案 0 :(得分:1)

my $text = 'some_text_here__what__i__want_here';
# .*?     # Match a minimal number of characters - see "man perlre"
# /s      # Make . match also newline - see "man perlre"
my ($var) =  $text =~ /^.*?__(.*)$/s;
# $var is not defined when there is no __ in the string
print "var=${var}\n" if defined($var);

答案 1 :(得分:1)

您可能会认为这是split的第三个参数有用的示例。 split的第三个参数限制了要返回的元素数。这是一个示例:

my @examples = (
    'some_text_here__what__i_want_here',
    '__keep_this__part',
    'nothing_found_here',
    'nothing_after__',
);

foreach my $string (@examples) {
    my $want = (split /__/, $string, 2)[1];
    print "$string => ", (defined $want ? $want : ''), "\n";
}

输出将如下所示:

some_text_here__what__i_want_here => what__i_want_here
__keep_this__part => keep_this__part
nothing_found_here =>
nothing_after__ =>

此行有点密集:

my $want = (split /__/, $string, 2)[1];

让我们分解一下:

my ($prefix, $want) = split /__/, $string, 2;

2参数告诉split,无论模式/__/可以匹配多少次,我们只希望第一次发现就分裂一次。再举一个例子:

my (@parts) = split /#/, "foo#bar#baz#buzz", 3;

@parts数组将接收以下元素:'foo','bar','baz#buzz',因为我们告诉它在第二次拆分后停止拆分,因此我们总共得到三个结果中的元素。

回到您的情况,我们将最大元素数设置为2。然后,通过消除对my ($throwaway, $want) = ...的需求,我们可以进一步前进。通过提供索引,我们可以告诉Perl我们只关心split返回的事物列表中的第二个元素。

my $want = ('a', 'b', 'c', 'd')[2]; # c, the element at offset 2 in the list.

my $want = (split /__/, $string, 2)[1]; # The element at offset 1 in the list
                                        # of two elements returned by split.

答案 2 :(得分:0)

您使用方括号来进行排版,然后对字符串进行重新排序,第一组方括号()在替换的下一部分为$ 1,等等...

my $string = "some_text_here__what__i__want_here";
(my $newstring = $string) =~ s/(some_text_here)(__)(what__i__want_here)/$3$2$1/;
print $newstring;

输出

what__i__want_here__some_text_here