Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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 正则表达式麻烦:为什么不匹配?_Regex_Perl_Pcre_Regex Greedy - Fatal编程技术网

Regex 正则表达式麻烦:为什么不匹配?

Regex 正则表达式麻烦:为什么不匹配?,regex,perl,pcre,regex-greedy,Regex,Perl,Pcre,Regex Greedy,我需要一个永远匹配的!正则表达式,用于提取Postgresql中与正则表达式匹配的数据 这是一个示例输入: #link showcatalog=123 text=blurb 还有我的正则表达式: /(?:showcatalog=([0-9]+))?/ 我用Perl尝试了这一点: perl -e 'use Data::Dumper; print Dumper([ "#link showcatalog=123 text=blurb" =~ /(?:showcatalog=([0-9]+))?/

我需要一个永远匹配的!正则表达式,用于提取Postgresql中与正则表达式匹配的数据

这是一个示例输入:

#link showcatalog=123 text=blurb
还有我的正则表达式:

/(?:showcatalog=([0-9]+))?/
我用Perl尝试了这一点:

perl -e 'use Data::Dumper; print Dumper([ "#link showcatalog=123 text=blurb" =~ /(?:showcatalog=([0-9]+))?/ ]);'
并期望得到$VAR1=[123],但得到了$VAR1=[undef]。我不明白,因为“?”是贪婪的,它的行为不是贪婪的。我不明白什么?我尝试了regex101.com,但没有帮到我。如何达到预期的效果

贪婪,难道它不应该优先考虑匹配文本吗

如果没有匹配,例如在

#link text=blurb"
我只想得到$VAR1=[unde]

这是正确的吗?是贪婪的,但它匹配0或1次,直到满足条件为止。贪婪是在零或一个条件下。在您的例子中,由于整个正则表达式都是可选的,由?包围,所以零次是首选的,因为它是第一种可能

引擎一步一步地运行,试图匹配您的表达式。在字符串的第一个字符中,零匹配已经是可能的,因此不会返回任何内容。从这个意义上说?是贪婪的如果零或一是可能的,它将选择一,但如果匹配已经满足它返回。贪婪并不优先于匹配整个表达式。如果是指:如果有可能采取零或一采取一

您的[0-9]只是\d。因此,如果需要提取数字,可以使用以下方法:

/showcatalog=(\d+)/
要提取整个文本showcatalog和数字,只需使用

/(showcatalog=\d+)/
与您的命令类似:

perl -e 'use Data::Dumper; print Dumper([ "#link showcatalog=123 text=blurb" =~ /showcatalog=(\d+)/ ]);'
在Perl脚本中:

my $string1 = "#link showcatalog=123 text=blurb";
my ($number1) = $string1 =~ /showcatalog=(\d+)/;
print Dumper([ $number1 ]);

my $string2 = "#link text=blurb";
my ($number2) = $string2 =~ /showcatalog=(\d+)/;
print Dumper([ $number2 ]);
如果使用以下内容,则可以强制显示undef:

/(?:.*showcatalog=(\d+))?/
这是正确的吗?是贪婪的,但它匹配0或1次,直到满足条件为止。贪婪是在零或一个条件下。在您的例子中,由于整个正则表达式都是可选的,由?包围,所以零次是首选的,因为它是第一种可能

引擎一步一步地运行,试图匹配您的表达式。在字符串的第一个字符中,零匹配已经是可能的,因此不会返回任何内容。从这个意义上说?是贪婪的如果零或一是可能的,它将选择一,但如果匹配已经满足它返回。贪婪并不优先于匹配整个表达式。如果是指:如果有可能采取零或一采取一

您的[0-9]只是\d。因此,如果需要提取数字,可以使用以下方法:

/showcatalog=(\d+)/
要提取整个文本showcatalog和数字,只需使用

/(showcatalog=\d+)/
与您的命令类似:

perl -e 'use Data::Dumper; print Dumper([ "#link showcatalog=123 text=blurb" =~ /showcatalog=(\d+)/ ]);'
在Perl脚本中:

my $string1 = "#link showcatalog=123 text=blurb";
my ($number1) = $string1 =~ /showcatalog=(\d+)/;
print Dumper([ $number1 ]);

my $string2 = "#link text=blurb";
my ($number2) = $string2 =~ /showcatalog=(\d+)/;
print Dumper([ $number2 ]);
如果使用以下内容,则可以强制显示undef:

/(?:.*showcatalog=(\d+))?/

问题是你只得到了第一场比赛,在哪里?:。。。?由于期末考试,小组是空的?。它可以在字符串中的任何位置匹配;要查看所有可能的匹配,请使用/g修改器:

perl -e 'use Data::Dumper; print Dumper([ "#link showcatalog=123 text=blurb" =~ /(?:showcatalog=([0-9]+))?/g ]);'
$VAR1 = [
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          '123',
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef
        ];

问题是你只得到了第一场比赛,在哪里?:。。。?由于期末考试,小组是空的?。它可以在字符串中的任何位置匹配;要查看所有可能的匹配,请使用/g修改器:

perl -e 'use Data::Dumper; print Dumper([ "#link showcatalog=123 text=blurb" =~ /(?:showcatalog=([0-9]+))?/g ]);'
$VAR1 = [
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          '123',
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef
        ];

你需要使用这种模式

 /.*showcatalog=([0-9]+)|/
.*强制回溯以查找字符串中的任何位置的showcatalog=[0-9]+,并且|还允许空字符串与第一个备选方案失败时始终匹配的字符串相匹配,将$1设置为undef

输出 输出
你需要使用这种模式

 /.*showcatalog=([0-9]+)|/
.*强制回溯以查找字符串中的任何位置的showcatalog=[0-9]+,并且|还允许空字符串与第一个备选方案失败时始终匹配的字符串相匹配,将$1设置为undef

输出 输出
你能为你的正则表达式提供一些输入数据吗?@JohnDoe:输入是link showcatalog=123 text=blurb。如果匹配,则预期输出为[match],如果不匹配,则预期输出为[undef]。因此,您真正的问题是关于select regexp_matches'link showcatalog=123 text=blurb','?:showcatalog=[0-9]+;在postgresql中,对吗?我认为所有这些perl的东西并不能让问题变得更清楚。为什么要添加这个??这意味着如果组不在这里,它也匹配。你能解释一下真正的目标吗?@sidyll:别客气!你能为你的正则表达式提供一些输入数据吗?@JohnDoe:输入是link showcatalog=123 text=blurb。如果匹配,则预期输出为[match],如果不匹配,则预期输出为[undef]。因此,您真正的问题是关于select regexp_matches'link showcatalog=123 text=blurb','?:showcatalog=[0-9]+;在postgresql中,对吗?我认为所有这些perl的东西并不能让问题变得更清楚。为什么要添加这个??这意味着如果组不在这里,它也匹配。你能解释一下真正的目标吗?@sidyll:放心吧!?:这不是一个标题,这是一个不吸引人的群体。谢谢你的注意,我完全误解了这似乎不能回答问题。你检查过更新的perl命令是否给出了预期的结果吗?@DenysSéguret Yes?:看一眼,这不是一个非捕获组吗。您是否检查了更新的perl命令
ds给出了预期的结果?@DenysSéguret YesCan在EOF at-e第1行之前的任何地方都找不到字符串终止符。我只是想知道为什么在检查上面的代码perl-e'use Data::Dumper时会出现这个错误;打印转储程序[link showcatalog=123 text=blurb=~/?:showcatalog=[0-9]+?/g];'在Windows7中cmd@ssr1012:在windows中,您必须在命令行中使用外部双引号。啊,现在我了解了这种行为,谢谢您阻止我搔头。你知道如何表达正则表达式来实现预期的输出吗?@Searle:坦白说,我不明白你想要实现什么。什么输入是可能的,什么输出是预期的?非常感谢。我明白了。在EOF at-e第1行之前的任何地方都找不到字符串终止符。我只是想知道为什么在检查上面的代码perl-e'use Data::Dumper时会出现这个错误;打印转储程序[link showcatalog=123 text=blurb=~/?:showcatalog=[0-9]+?/g];'在Windows7中cmd@ssr1012:在windows中,您必须在命令行中使用外部双引号。啊,现在我了解了这种行为,谢谢您阻止我搔头。你知道如何表达正则表达式来实现预期的输出吗?@Searle:坦白说,我不明白你想要实现什么。什么输入是可能的,什么输出是预期的?非常感谢。我明白了。那很聪明,谢谢。我希望你同意我接受西迪尔的答案,因为他早些时候发布了他的解决方案…@Searle:你选择哪一个完全取决于你,但我看不出西迪尔的几个答案中有任何一个有效。您选择了哪一个?带/?:.*showcatalog=\d+?/-我的窍门是将。*添加到非捕获组。这很聪明,谢谢。我希望你同意我接受西迪尔的答案,因为他早些时候发布了他的解决方案…@Searle:你选择哪一个完全取决于你,但我看不出西迪尔的几个答案中有任何一个有效。您选择了哪一个?带/?:.*showcatalog=\d+?/-我的窍门是将。*添加到非捕获组。