Regex: необязательная группа - PullRequest
       3

Regex: необязательная группа

3 голосов
/ 27 августа 2009

Я хочу разбить строку следующим образом:

abc//def//ghi

в части до и после первого появления //:

a: abc
b: //def//ghi

Я сейчас использую это регулярное выражение:

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

Который до сих пор отлично работает.

Однако иногда // отсутствует в исходной строке, и, очевидно, регулярное выражение не соответствует. Как можно сделать вторую группу необязательной?

Вход, подобный abc, должен соответствовать:

a: abc
b: (empty)

Я пытался (?<a>.*?)(?<b>//.*)?, но в Expresso у меня было много пустых результатов, поэтому я думаю, что это неправильная идея.

Ответы [ 3 ]

7 голосов
/ 27 августа 2009

Попробуйте ^ в начале вашего выражения, чтобы соответствовать началу строки, и $ в конце, чтобы соответствовать концу строки (это заставит работать несвязное совпадение).

^(?<a>.*?)(?<b>//.*)?$
0 голосов
/ 27 августа 2009

Зачем вообще использовать групповое сопоставление? Почему бы просто не разделить на "//" в виде регулярного выражения или простой строки?

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 группы]

0 голосов
/ 27 августа 2009

Доказательство ответа 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...