2012-07-03 2 views
2

Я пытаюсь найти коды aiport с строкой типа (JFK) или [FRA], используя регулярное выражение.Регулярное выражение для определения круглых или квадратных скобок

У меня нет необходимости проверять правильность указанного кода аэропорта. Скобки могут содержать почти три заглавные буквы.

Вот мое текущее решение, которое действительно работает для круглых скобках, но не квадратные скобки:

[((\[]([A-Z]{{3}})[))\]] 

Спасибо!

ответ

4

Ваше регулярное выражение кажется, что это пытаются соответствовать слишком много, попробуйте этот один:

^[(\[][A-Z]{3}[)\]]$ 

^ соответствует началу строки (то, что вы можете или не может понадобиться)

[(\[] является класс символов, который соответствует ( или [

[A-Z]{3} соответствует три Капитолийским буквам

[)\]] класс персонажа, который соответствует ) или ]

$ соответствует концу строки (то, что вы можете или не может понадобиться)

Click here to see the test results

Обратите внимание, что [ и ] специальные символы в регулярных выражениях, и я должен был избежать их с помощью \, чтобы указать, что мне нужен буквенный символ.

Надеется, что это помогает

+1

Ряды регулярных выражений, которые я знаю, не поддерживают экранирование, они не поддерживают метасимволы, но соответствуют самим символам. Вопрос заключается в том, как включить либо из ']', и '^' в набор, и ответ поставлен в нужное место! например '^', '[] ^]', '[^] ^]' –

+0

Это будет соответствовать '(FRA]' тоже! –

3

, если вы хотите (1) совпадают буквы в одной группе соответствия и (2) только матч Паренс или кронштейнов (не один из каждых), то это довольно сложно. одним из решений является:

.([A-Z]{3}).((?<=\(...\))|(?<=\[...\])) 

где первая часть соответствует буквам, а трейлинг-стоп проверяет скобки/парсеры.

см http://fiddle.re/u19v - это соответствует [ABC] и (DEF), но не (PQR] (что "правильный" ответ делает).

если вы хотите скобки в матче, перемещать захватив скобки вне .:

(.[A-Z]{3}.)((?<=\(...\))|(?<=\[...\])) 

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

+0

Есть люди, которые говорят, что вопрос не в том, как далеко мы можем идти с регулярными выражениями (которые на практике нерегулярные регулярные выражения сегодня), но как для ** должно быть ** мы идем ... –

0

Легко понять, более говор агностик и правильно:

^([A-Z][A-Z][A-Z])\|\[[A-Z][A-Z][A-Z]\]$ 

Вы, возможно, придется изменить вытекание из скобок и труб в зависимости от вашего регулярного выражения диалекта.

+0

, это будет помещать буквы в parens (не квадратные скобки) в соответствующую группу. Если вы включите второй образец в parens, тогда вы можете получить их, но они будут в разных группах, я думаю, следовательно, мое решение ... –

+0

@andrewcooke: Это не соответствующая группа, но буквально parens. (Цитируя себя: «Возможно, вам придется сменить экранирование парнеров и трубы в зависимости от вашего регулярного выражения. ') –

+0

Регулярные выражения используют парсеры для группировки, даже если они не захватывают (например, парсеры включены в раздел« базовые понятия »статьи википедии), поэтому вам всегда нужно избегать если вы хотите использовать их как литералы (если только вы находитесь внутри набора символов - внутри квадратных скобок - где изменяются правила). у вас есть пример реализации регулярного выражения, для которого ваше выражение будет работать? –

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