我想分割一个这样的字符串:
abc//def//ghi
在第一次出现//
之前和之后的部分:
a: abc
b: //def//ghi
我目前正在使用此正则表达式:
(?<a>.*?)(?<b>//.*)
到目前为止工作正常。
但是,有时候源字符串中缺少//
,显然正则表达式无法匹配。如何才能使第二组成为可选项?
abc
之类的输入应匹配:
a: abc
b: (empty)
我尝试了(?<a>.*?)(?<b>//.*)?
但是在Expresso中留下了很多NULL结果,所以我猜这是错误的想法。
答案 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组]