регулярное выражение javascript, которое получает все поддомены
у меня есть следующее регулярное выражение:
[!?.](.*).example.com
и этот пример строки:
test foo abc.def.example.com bar ghi.jkl.example.com def
Я хочу, чтобы продукты RegEx соответствовали следующим матчам:def.example.com
и jkl.example.com
.
Что я должен изменить? Должен работать на всех поддоменах example.com - ... Если возможно, он должен принимать только первый уровень поддомена (abc.def.example.com
->def.example.com
).
проверили его на regexpal, не работает в полной мере :(
2 ответов
просто на заметку, в то время как ответ Хамзы работает для вашего текущего образца кода, если вам нужно убедиться, что доменные имена также действительны, вы можете попробовать другой подход, так как [^.\s]+
будет соответствовать любой символ, который не является пробелом или .
(например, что регулярное выражение будет соответствовать jk&^%&*(l.example.com
как" действительный " поддомен).
поскольку для значений доменных имен гораздо меньше допустимых символов, чем недопустимых, вы можете использовать "аддитивный" подход к регулярному выражению, а не вычитающий. Этот шаблон здесь, вероятно, тот, который вы ищете для допустимых доменных имен:/(?:[\s.])([a-z0-9][a-z0-9-]+[a-z0-9]\.example\.com)/gi
чтобы сломать его немного больше . . .
-
(?:[\s.])
- соответствует пространству или.
это будет означать начало поддомена уровня loweset -
([a-z0-9][a-z0-9-]+[a-z0-9]\.example\.com)
- это захватывает группу букв, цифр или тире, которые должны начинаться и заканчиваться буквой или числом (доменное имя правила), а затемexample.com
домен. -
gi
- делает шаблон regex жадным и нечувствительным к регистру
на данный момент, это просто вопрос захватывая играм. С .match()
не играет хорошо с регулярным выражением "группы без захвата", используйте .exec()
вместо:
var domainString = "test foo abc.def.example.com bar ghi.jkl.example.com def";
var regDomainPattern = /(?:[\s.])([a-z0-9][a-z0-9-]+[a-z0-9]\.example\.com)/gi;
var aMatchedDomainStrings = [];
var patternMatch;
// loop through as long as .exec() still gets a match, and take the second index of the result (the one that ignores the non-capturing groups)
while (null != (patternMatch = regDomainPattern.exec(domainString))) {
aMatchedDomainStrings.push(patternMatch[1]);
}
в этот момент aMatchedDomainStrings
должен содержать все допустимые поддомены первого уровня.
var domainString = "test foo abc.def.example.com bar ghi.jkl.example.com def";
. . . должен получить вас:def.example.com
и jkl.example.com
, в то время как:
var domainString = "test foo abc.def.example.com bar ghi.jk&^%&*(l.example.com def";
. . . должен получить вас только:def.example.com
вы можете использовать следующие выражения : [^.\s]+\.example\.com
.
объяснение
-
[^.\s]+
: сопоставьте что-нибудь, кроме точки или пробела один или несколько раз -
\.example\.com
матчexample.com
обратите внимание, что вам не нужно избегать точки в классе символов