2010-08-23 4 views
4

У меня есть простая проблема, но я не могу решить эту проблему. Либо моя строка имеет формат ID: dddd со следующим регулярным выражением:Борьба с условными регулярными выражениями

/^ID: ([a-z0-9]*)$/ 

или следующим образом: ID: 1234 Status: 232, так со следующим регулярным выражением:

/^ID: ([a-z0-9]*) Status: ([a-z0-9]*)$/ 

Теперь я хочу сделать одно регулярное выражение которые могут обрабатывать оба. Первое, что я придумал был такой:

/^ID: ([a-z0-9]*)$|^ID: ([a-z0-9]*) Status: ([a-z0-9]*)$/ 

Это соответствует, но я смотрел на условные регулярные выражения, и подумал, что что-то должно быть возможно по линиям (псевдо-codish)

if the string contains /Status:/ 
    /^ID: ([a-z0-9]*)$/ 
else 
    /^ID: ([a-z0-9]*) Status: ([a-z0-9]*)$/ 

только, я не могу получить это правильно. Я думал, что должен использовать /?=/, но понятия не имею. Что-то вроде

/((?=Status)^ID: ([a-z0-9]*) Status: ([a-z0-9]*)$|^ID: ([a-z0-9]*)$/ 

, но это не работает.

Вы можете помочь?

+0

Ваш последний пример не является допустимым регулярным выражением. У него слишком много круглых скобок. –

+1

Имеет ли идентификатор всегда четыре буквенно-цифровых символа? Если да, то почему вы пишете '*' вместо '{4}'? Могут ли быть буквы верхнего и нижнего регистра? –

+0

Это был просто пример. Количество цифр не известно заранее. – nathanvda

ответ

6

Вы ищете ^ID: (\d+)(?: Status: (\d+))?$

редактировать: Поскольку вопрос помечается рубин стоит отметить, что в соответствии как this question и this flavour-comparison, Ruby не выполняет условное регулярное выражение.

http://www.regular-expressions.info - отличный источник информации по этому вопросу.

+0

@jerhinesmith: название упоминает условное re, но проблема под рукой может быть решена без них. Я использую (?: ), чтобы сделать шаблон несогласованным. Таким образом, $ 1 и $ 2 будут содержать совпадающие числа, последнее из которых является необязательным. –

+1

Я согласен, и это имеет смысл, но если Ruby не поддерживает истинное «условное регулярное выражение», то это должно быть хотя бы указано в ответе. Я больше думаю о будущих посетителях этого вопроса (из google и т. Д.), И на первый взгляд кажется, что пока вы решаете проблему, нет никаких упоминаний о том, почему * они должны использовать этот метод и * нет * использование условный regex. – jerhinesmith

+0

@jerhinesmith: Ты прав. Отредактировано соответственно. –

3

Вы должны .* в вашем опережающем просмотре: (Rubular)

/(?=.*Status)^ID: ([a-z0-9]*) Status: ([a-z0-9]*)$|^ID: ([a-z0-9]*)$/ 

Однако для конкретного примера вам не нужен предпросмотр. Вы можете просто использовать ? квантор вместо: (Rubular)

/^ID: ([a-z0-9]*)(?: Status: ([a-z0-9]*))?$/ 
+0

Благодарим вас за ссылку на документацию и два примера. – nathanvda

2

Интересно, что согласно this question, Ruby 1.8/1.9 не поддерживает условные регулярные выражения.

У вас (или кто-либо из ответчиков) был прочитан иначе? Если это так, возможно, будет полезно обновить связанный вопрос, чтобы он больше не приводил неверную информацию.

+0

Регулярные утверждения/lookarounds и регулярные выражения - это две разные вещи. – polygenelubricants

+0

Не вопрос о регулярных выражениях? Наверное, я не уверен, что вижу твою точку. Этот вопрос и связанный с ним вопрос, похоже, используют общий формат '(предикат) yes-pattern | no-pattern), поэтому, если я что-то не хватает, они очень связаны. – jerhinesmith

+0

Ha! Это объясняет вещи :) – nathanvda

Смежные вопросы