Страницы

Поиск по вопросам

суббота, 22 июня 2019 г.

Открывающие и закрывающие скобки в RegExp

Как с помощью регулярного выражения проверять наличие закрывающей и открывающей скобки или каких-либо других парных символов? К примеру, имеется строка состоящая из 32 шестнадцатеричных чисел, которая может быть в круглых скобках, фигурных, квадратных, меньше-больше. На данный момент имею выражение:
var re = new RegExp("([\(][0-9A-Fa-f]{32}[\)]|[0-9A-Fa-f]{32})");
Но как видно из примера, с таким подходом для каждой новой пары символов придется полностью повторять первую часть выражения. В случае использования одинаковых открывающих и закрывающих символов можно было бы написать так:
var re = new RegExp("((["'`´])[0-9A-Fa-f]{32}\2|[0-9A-Fa-f]{32})");
, т.е. можно обратиться к запоминающей скобке по ее индексу, но с парными символами такое не пройдет. Может быть существует более лаконичное выражение, чем:
var re = new RegExp("("+ "[\(][0-9A-Fa-f]{32}[\)]|"+ "[\{][0-9A-Fa-f]{32}[\}]|"+ "[\[][0-9A-Fa-f]{32}[\]]|"+ "<[0-9A-Fa-f]{32}>|"+ "[0-9A-Fa-f]{32})" );


Ответ

Есть несколько путей решить задачу, например такой будет работать в JavaScript:
/(?=(?:\(.*\)|\[.*\]|<.*>|\{.*\}|[0-9a-f]*)$)^[\[{(<]?[0-9a-f]{32}[\]}>)]?$/i
Используются позиционные проверки.
Следующий способ в JavaScript работать не будет, потому что использованы условия, которые движком не поддерживаются.
/^(<)?(\()?(\{)?(\[)?(?<=^.?)[0-9a-f]{32}(?(1)>|(?(2)\)|(?(3)\}|(?(4)\]|))))$/i

Если первый способ для Вас легко читаем и понимаем- используйте его. Он очень прост на самом деле и не содержит дублированных последовательностей.

Комментариев нет:

Отправить комментарий