Как с помощью регулярного выражения проверять наличие закрывающей и открывающей скобки или каких-либо других парных символов? К примеру, имеется строка состоящая из 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
Если первый способ для Вас легко читаем и понимаем- используйте его. Он очень прост на самом деле и не содержит дублированных последовательностей.
Комментариев нет:
Отправить комментарий