регулярное выражение 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, не работает в полной мере :( Screenshot

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

обратите внимание, что вам не нужно избегать точки в классе символов