регулярное выражение 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 
обратите внимание, что вам не нужно избегать точки в классе символов