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:需要(?:)将未捕获的文字括号与其捕获的内容进行分组。非常感谢。这正是我一直在寻找的。是吗?使事物可选的量词,而不是非捕获参数,(?:)。请参阅