Страницы

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

пятница, 10 января 2020 г.

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

#javascript #регулярные_выражения


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

    


Ответы

Ответ 1



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

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

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