Регулярное выражение со всеми опциональными компонентами: Как предотвращать пустые задержания?

Я должен обрабатывать цепь стоимости, отделенной запятыми, которые он содержит tripletes, стоимости и переводить во время выполнения каждый triplete в различные типы, как Ваш контент, данные о вводе были бы похожими в:

"1x2y3z,80r160g255b,48h30m50s,1x3z,255b,1h,..."

Так что каждая суб-цепь должна бы быть обработанной следующего способа:

  • 1x2y3z он был бы обработан как Vector3 с x = 1, y = 2 и z = 3.
  • 80r160g255b он был бы обработан как Color с r = 80, g = 160 и b = 255.
  • 48h30m50s он был бы обработан как Time с h = 48, m = 30 и s = 50.

Проблема, что я нахожусь, состоит в том, что каждый компонент опциональный (хотя он всегда появляется в том же порядке), так что следующие цепи также Vector3, Color и Time правильные:

  • 1x3z он был бы обработан как Vector3 с x = 1, y = 0 и z = 3.
  • 255b он был бы обработан как Color с r = 0, g = 0 и b = 255.
  • 1h он был бы обработан как Time с h = 1, m = 0 и s = 0.

Что я попробовал до настоящего времени?

Все компоненты как опциональные.

((?:\d+A)?(?:\d+B)?(?:\d+C)?)

Символы A, B и C они были бы заменены правильной буквой в каждом случае. Это выражение функционирует довольно кроме из-за тот факт, что он захватывает двойную порцию ожидаемых результатов (один для искавшей цепи и другого задержания с пустой цепью тотчас после первого совпадения), например:

  • 1h1m1s два совпадения:
    1. "1h1m1s".
    2. "".
  • 11x50z два совпадения:
    1. "11x50z".
    2. "".
  • 11111h два совпадения:
    1. "11111h".
    2. "".

Я не могу говорить, что это не подождет... в конце концов пустая цепь, он соответствует регулярному пропорциональному выражению, когда все компоненты пустые; так что, чтобы решать эту проблему, я попробовал следующее:

Квантификатор от 1 до 3 элементов.

((?:\d+[ABC]){1,3})

Но с этим выражением, захватываются цепи с неправильным или включенным порядком с повторенными элементами:

  • 1s1m1h совпадение, он не был бы должен совпадать (неправильный порядок).
  • 11z50z совпадение, он не был бы должен совпадать (повторенные компоненты).
  • 1r1r1b совпадение, он не был бы должен совпадать (повторенные компоненты).

Так что я сделал другую попытку с измененной версией моей первой попытки:

Совпадать начала ^ в конец $ цепи.

^((?:\d+A)?(?:\d+B)?(?:\d+C)?)$

Функционируй лучше, чем первая версия, но продолжи совпадать с пустыми цепями, с добавленной невыгодой, которая сначала я должен отделять цепь из-за каждой запятой (,) и перемещать выражение на каждой суб-цепи.

Используя Lookahead

Попытка используя Lookahead:

\b(?=[^,])(?=.)((?:\d+A)?(?:\d+B)?(?:\d+C)?)\b

Против следующей цепи:

"48h30m50s,1h,1h1m1s,11111h,1s1m1h,1h1h1h,1s,1m,1443s,adfank,12322134445688,48h"

Результаты очень хорошие, обнаружь действительные совпадения, не добавляя фальшивых позитивов. К несчастью, каждый раз, когда находится цепь, которая не совпадает с выражением, добавляет пустая цепь непосредственно перед не действительная цепь (найди "" перед "1s1m1h", "1h1h1h", "adfank" и "12322134445688") так что я сделал последнюю попытку изменяя условие Lookahead:

\b(?=(?:\d+[ABC]){1,3})(?=.)((?:\d+A)?(?:\d+B)?(?:\d+C)?)\b

Это выражение удаляет пустые цепи, обнаруженные перед любой цепью, которая не совпадала бы с (?:\d+[ABC]){1,3}) (пустые цепи перед "adfank" и "12322134445688") но пустые цепи перед "1s1m1h", "1h1h1h" еще они обнаружены.


Так что мой вопрос: Существует какое-то регулярное выражение, которое находило бы совпадения в tripletes стоимости в определенном порядке, без повторений, со всеми компонентами опциональными, но составленная по крайней мере элементом и которое не находит совпадения в пустых цепях?

Инструмент регулярных выражений, которые я использую, <regex> C ++ 11.

10
задан 06.03.2017, 13:30
0 ответов