Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在Perl中提取符号后的字符串_Regex_String_Perl_Split - Fatal编程技术网

Regex 在Perl中提取符号后的字符串

Regex 在Perl中提取符号后的字符串,regex,string,perl,split,Regex,String,Perl,Split,如何在Perl中提取符号后的字符串 我试着做了一些搜索,但即使是我找到的代码也不起作用 我正在尝试提取冒号后面的字符串。所以我想在冒号后显示所有内容 例如: string = day1: string over here substring = string over here 到目前为止,我已经尝试: $substring = $string=~ /(\:.*)\s*$/; 但它只反复输出数字1。这是因为标量上下文中的模式匹配是布尔测试。如果要捕获括号内容(捕获组),则需要一个列表上下文

如何在Perl中提取符号后的字符串

我试着做了一些搜索,但即使是我找到的代码也不起作用

我正在尝试提取冒号后面的字符串。所以我想在冒号后显示所有内容

例如:

string = day1: string over here

substring = string over here
到目前为止,我已经尝试:

$substring = $string=~ /(\:.*)\s*$/;

但它只反复输出数字1。

这是因为标量上下文中的模式匹配是布尔测试。如果要捕获括号内容(捕获组),则需要一个列表上下文。如果列表中只有一个元素,则可以:

试试这个:

 my ( $substring ) = $string=~ /(\:.*)\s*$/;
差异可能有点微妙,但基本上-我们将模式匹配中的“所有点击”分配到一个列表中。。。这包括一个要素

注意-这样您就可以:

my @matches = $string =~ m/(.)/g; 
my ( $key, $value ) = $string =~ m/(\w+)=(\w+)/; 
并获得多个“点击”返回。如果您按照上述操作,您将只获得第一个匹配项-这与您的模式无关,但您可以:

my @matches = $string =~ m/(.)/g; 
my ( $key, $value ) = $string =~ m/(\w+)=(\w+)/; 

比如说

我通常使用括号从文本中提取部分,然后引用存储在$1变量中的结果

请看一个例子:

my $text = "day1: string over here";

print $1 if ($text =~ /:\s*(.+)$/);
但该代码也可能收到类似的结果:

my $text = "day1: string over here"; 

my ($a) = $text =~ /:\s*(.+)$/;
print $a;

您还可以使用以下函数实现desire子字符串:

#!/usr/bin/perl
use warnings;
use strict;

my $string = "day1: string over here";

my (undef, $substring) = split(':\s*', $string);

print $substring, "\n";
输出:

string over here
或者,您可以通过在正则表达式中使用捕获组
()
来实现此目的:

my $string = "day1: string over here";
$string =~ m/(.*)\:\s+(.*)$/;
my $substring = $2;
print $substring, "\n";

正则表达式应该是
/:\s*(.*)\s*$/
我不清楚为什么在正则表达式示例中捕获两个组,然后忽略其中一个。OP想要提取冒号后面的字符串,所以我忽略了第一个。已批准。但是您可以完全省略前面的
(.*)
,只访问
$1
。还是我遗漏了什么?我想展示OP的第一部分在哪里,以及捕获组是如何工作的,所以我没有忽略主要部分。