Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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_Perl - Fatal编程技术网

Regex 如何在Perl正则表达式中具有可选匹配?

Regex 如何在Perl正则表达式中具有可选匹配?,regex,perl,Regex,Perl,我从配置文件中读取了一个字符串。字符串的结构如下所示 (long_string)long_string(long_string) 括号内的任何项目,包括括号本身,都是可选的。我有下面的正则表达式匹配整个字符串,但我不知道如何使正则表达式的某些部分具有“?”的可选性 下面是一些用于输入的有效字符串 (a)like(1) like(very long string here) like 这里是我的regexp,只与第一个匹配 ^\((?<short>.*)\)(?<text&g

我从配置文件中读取了一个字符串。字符串的结构如下所示

(long_string)long_string(long_string)
括号内的任何项目,包括括号本身,都是可选的。我有下面的正则表达式匹配整个字符串,但我不知道如何使正则表达式的某些部分具有“?”的可选性

下面是一些用于输入的有效字符串

(a)like(1)
like(very long string here)
like
这里是我的regexp,只与第一个匹配

^\((?<short>.*)\)(?<text>.*)\((?<return>.*)\)$
^\(?。)(?。)\(?。)$

如何转换我的regexp以使括号对于匹配是可选的?

用不匹配的组围绕两个子模式
(?:
expr
,并使它们成为可选的:

^(?:\((?<short>.*)\))?(?<text>.*)(?:\((?<return>.*)\))?$

用不匹配的组包围两个子模式
(?:
expr
,并使它们成为可选的:

^(?:\((?<short>.*)\))?(?<text>.*)(?:\((?<return>.*)\))?$

我要做的是用分组成员包装(和),因此

\((?<short>.*)\)
\((?*)\)
将其更改为:

(\(<short>.*\))
(\(.*))
这样,它将匹配()和内部文本。然后,如果它们存在,则使用另一个正则表达式来消除括号


我对命名匹配语法不是很熟悉,因此组语法可能已关闭,但您应该了解这一点。

我要做的是用分组成员包装(和),而不是

\((?<short>.*)\)
\((?*)\)
将其更改为:

(\(<short>.*\))
(\(.*))
这样,它将匹配()和内部文本。然后,如果它们存在,则使用另一个正则表达式来消除括号

我对命名匹配语法不是很熟悉,因此组语法可能已关闭,但您应该了解这一点。

尝试一下

string[] strings = new string[] { "(a)like(1)", "like(very long string here)", "like" };
foreach (string s in strings)
{
    System.Text.RegularExpressions.Match match = System.Text.RegularExpressions.Regex.Match(s, @"^(\((?<short>.)\))?(?<text>.+)?(\((?<return>.+)\))?$");
    if (match.Success)
    {
        // do logic to handle the match
    }
}
string[]strings=newstring[]{“(a)like(1)”,“like(这里很长的字符串)”,“like”};
foreach(字符串中的字符串s)
{
System.Text.RegularExpressions.Match Match=System.Text.RegularExpressions.Regex.Match(s,@“^(\((?)\)?(?.+)?(\((?.+)\)?$”;
如果(匹配成功)
{
//执行逻辑来处理匹配
}
}
试试看

string[] strings = new string[] { "(a)like(1)", "like(very long string here)", "like" };
foreach (string s in strings)
{
    System.Text.RegularExpressions.Match match = System.Text.RegularExpressions.Regex.Match(s, @"^(\((?<short>.)\))?(?<text>.+)?(\((?<return>.+)\))?$");
    if (match.Success)
    {
        // do logic to handle the match
    }
}
string[]strings=newstring[]{“(a)like(1)”,“like(这里很长的字符串)”,“like”};
foreach(字符串中的字符串s)
{
System.Text.RegularExpressions.Match Match=System.Text.RegularExpressions.Regex.Match(s,@“^(\((?)\)?(?.+)?(\((?.+)\)?$”;
如果(匹配成功)
{
//执行逻辑来处理匹配
}
}

好吧,让它们成为可选的,然后:

^(?<short>\(.*\))?(?<text>.*)(?<return>\(.*\))?$
参加第二组比赛。但如果您坚持使用命名捕获:

^(?<short>\([^)]*\))?(?<text>[^(]*)(?<return>\([^)]*\))?$
^(?\([^)]*\)?(?[^(]*)(?\([^)]*\)$

好吧,让它们成为可选的,然后:

^(?<short>\(.*\))?(?<text>.*)(?<return>\(.*\))?$
参加第二组比赛。但如果您坚持使用命名捕获:

^(?<short>\([^)]*\))?(?<text>[^(]*)(?<return>\([^)]*\))?$
^(?\([^)]*\)?(?[^(]*)(?\([^)]*\)$

使用下面的代码,您将始终获得由三个元素组成的@matches数组。如果其中一个可选部分不匹配,则相应的条目将是未定义的

#!/usr/bin/perl

use strict;
use warnings;

my $optional = qr/(?:\(([^)]+?)\))?/;
my $required = qr/([^()]+)/;

while ( my $line = <DATA> ) {
    chomp $line;
    last unless $line =~ /\S/;

    if ( my @matches = ($line =~ /$optional$required$optional/) ) {
        no warnings 'uninitialized';
        print "---$_---\n" for @matches;
    }
}

__DATA__
(a)like(1)
like(very long string here)
like
#/usr/bin/perl
严格使用;
使用警告;
my$optional=qr/(?:\([^)]+?)\)/;
我的$required=qr/([^()]+)/;
while(我的$line=){
chomp$行;
最后,除非$line=~/\S/;
if(my@matches=($line=~/$optional$required$optional/){
没有“未初始化”的警告;
为@matches打印“--$\--\n”;
}
}
__资料__
(a) like(1)
比如(这里的绳子很长)
喜欢

使用下面的代码,您将始终获得由三个元素组成的@matches数组。如果其中一个可选部分不匹配,则相应的条目将是未定义的

#!/usr/bin/perl

use strict;
use warnings;

my $optional = qr/(?:\(([^)]+?)\))?/;
my $required = qr/([^()]+)/;

while ( my $line = <DATA> ) {
    chomp $line;
    last unless $line =~ /\S/;

    if ( my @matches = ($line =~ /$optional$required$optional/) ) {
        no warnings 'uninitialized';
        print "---$_---\n" for @matches;
    }
}

__DATA__
(a)like(1)
like(very long string here)
like
#/usr/bin/perl
严格使用;
使用警告;
my$optional=qr/(?:\([^)]+?)\)/;
我的$required=qr/([^()]+)/;
while(我的$line=){
chomp$行;
最后,除非$line=~/\S/;
if(my@matches=($line=~/$optional$required$optional/){
没有“未初始化”的警告;
为@matches打印“--$\--\n”;
}
}
__资料__
(a) like(1)
比如(这里的绳子很长)
喜欢

无需将它们包装在非捕获组中。您可以将普通组设为可选组,即使id与任何内容都不匹配,它仍将起作用。我想他不希望将括号作为匹配的一部分。@Tomalak:需要(?:)将未捕获的文字括号与其捕获的内容进行分组。非常感谢。这正是我一直在寻找的。是吗?使事物可选的量词,而不是非捕获参数,(?:)。无需将它们包装在非捕获组中。您可以将普通组设为可选组,即使id与任何内容都不匹配,它仍将起作用。我想他不希望将括号作为匹配的一部分。@Tomalak:需要(?:)将未捕获的文字括号与其捕获的内容进行分组。非常感谢。这正是我一直在寻找的。是吗?使事物可选的量词,而不是非捕获参数,(?:)。请参阅