正则表达式:可选组

时间:2009-08-27 11:21:46

标签: regex

我想分割一个这样的字符串:

abc//def//ghi

在第一次出现//之前和之后的部分:

a: abc
b: //def//ghi

我目前正在使用此正则表达式:

(?<a>.*?)(?<b>//.*)

到目前为止工作正常。

但是,有时候源字符串中缺少//,显然正则表达式无法匹配。如何才能使第二组成为可选项?

abc之类的输入应匹配:

a: abc
b: (empty)

我尝试了(?<a>.*?)(?<b>//.*)?但是在Expresso中留下了很多NULL结果,所以我猜这是错误的想法。

3 个答案:

答案 0 :(得分:7)

在表达式的开头尝试^以匹配字符串的开头,并在结尾处使用$来匹配字符串的结尾(这将使非贪婪的匹配工作)。

^(?<a>.*?)(?<b>//.*)?$

答案 1 :(得分:0)

Stevo3000答案的证明(Python):

import re

test_strings = ['abc//def//ghi', 'abc//def', 'abc']

regex = re.compile("(?P<a>.*?)(?P<b>//.*)?$")

for ts in test_strings:
    match = regex.match(ts)
    print 'a:', match.group('a'), 'b:', match.group('b')

a: abc b: //def//ghi
a: abc b: //def
a: abc b: None

答案 2 :(得分:-1)

为什么要使用群组匹配?为什么不将"//"拆分为正则表达式还是普通字符串?

use strict;

my $str = 'abc//def//ghi';
my $short = 'abc';

print "The first:\n";
my @groups = split(/\/\//, $str, 2);
foreach my $val (@groups) {
print "$val\n";
}

print "The second:\n";
@groups = split(/\/\//, $short, 2);
foreach my $val (@groups) {
print "$val\n";
}

给出

The first:
abc
def//ghi
The second:
abc

[编辑:已修复以返回最多2组]