2015-01-12 3 views
0

У меня есть строки, поступающие в мое приложение. Каждая входящая строка состоит из подстрок без пробелов между подстроками. Например, «ID1ID1ID1ID2ID2ID2», где «ID1» является подстрокой, а «ID2» - подстрокой. Я хочу регулярное выражение, которое может обнаружить, когда есть шаблон, в котором подстрока окружает набор подстрок, который не содержит первую подстроку. Так, например, «ID1ID2ID1», «ID1ID1ID3ID1» и «ID1ID2ID3ID2ID1» будут соответствовать всем. Наряду с входящей строкой, у меня есть первая подстрока в этой строке (то есть ID1). Итак, используя эту первую подстроку, я хочу сказать: «Сопоставьте любое количество ID1, затем (любая строка, которая не является ID1), а затем любое количество ID1».Как я могу сопоставить этот шаблон с использованием регулярного выражения?

В качестве примера, что я пытался до сих пор:

.*ID1.*[^ID1]+ID1.* 

Я просто использовал regexpal, чтобы проверить это, и это, кажется, работает нормально. Есть ли лучший способ сделать это? Я искал использование lookarounds, но я не мог видеть, как их использовать, поскольку lookaround не потребляет какую-либо часть строки. Кроме того, факт, что я использую [^ ID1], кажется неправильным, так как это просто проверяет, чтобы символы I, D и 1 не использовались. Спасибо.

+0

'[^ ID1]' не будет делать то, что вы хотите .. –

+0

Это все зависит от длины подстроки. Подстрока всегда 3 символа? – sln

+0

Нет, это не обязательно 3 символа. – Nick

ответ

1

Если вы знаете его ID1, вы можете сделать это

# (?:ID1)+(?:(?!ID1|[ ]).)+(?:ID1)+ 

(?:       # Cluster group, leading 'ID1' 
     ID1       # An 'ID1' 
)+       # End cluster, do 1 to many times 

(?:       # Cluster group 
     (?!       # Lookahead NEGAGIVE assertion 
      ID1       # 'ID1' 
     | [ ]       # or space 
    )        # End lookahead 
     .        # Assertion passed, grab any character 
)+       # End cluster, do 1 to many times 

(?:       # Cluster group, trailing 'ID1' 
     ID1       # An 'ID1' 
)+       # End cluster, do 1 to many times 
+0

@Nick - любая синтаксическая документация регулярного выражения. Все '(..)' - это группы с областью действия, в смысле языка. Конкретные конструкции определяются персонажами сразу после начального пара. '(..)' группа захвата. '(?: ..)' non-capture (т.е. кластер), '(? = ..)' '(?! = ..)' '(? <= ..)' '(? < ! ..) 'lookaround assertions и т. д. – sln

+0

Спасибо. Для любой будущей ссылки я также нашел информацию об этой концепции здесь: http://www.regular-expressions.info/refcapture.html. – Nick

+0

@ Ник - Хорошо, спасибо. Я использую [RegexFormat 5] (http://www.regexformat.com) для практического создания/редактирования/тестирования регулярных выражений. Наступает день, когда чтение само по себе не поможет. – sln

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