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