2013-02-26 12 views
2

Я пытаюсь придумать с командой Javascript RegEx, который преобразует эти входы в следующие выходы:Javascript RegEx заменить условно удалить часть строки

INPUT      DESIRED OUTPUT 
mydomain.com   --> mydomain.com 
foo.mydomain.com  --> mydomain.com 
dev.mydomain.com  --> dev.mydomain.com 
dev-foo.mydomain.com --> dev.mydomain.com 

Вот правила:

  • Удалить поддомен из домена, если субдомно не начинается с символами «разработчиком»
  • Если субдомен начинается с «разработчиком», то выход «dev.domain.com»
  • Сохраните любой порт, указанный в конце домена.

Мои навыки регулярного выражения не позволяют мне. Это то, что у меня есть до сих пор:

'mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3'); 
// .mydomain.com 

'foo.mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3'); 
// foo.mydomain.com 

'dev-foo.mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3'); 
// dev.mydomain.com 

'dev.mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3'); 
// dev.mydomain.com 

Первые две неудачные и последние две работы. Какие-либо предложения?

Вот javascript, который работает, но я надеялся объединить его в одну команду замены регулярных выражений. Обратите внимание, что я также хочу сохранить любой порт, указанный в конце dmain.

var getHost = function() { 
    var host = window.location.host; 
    if (host.substring(0,3) === 'dev') { 
    return host.replace(/^(dev)?(-.*)?(mydomain\.com.*)/,'$1.$3'); 
    } 
    else { 
    return 'mydomain.com'; 
    } 
} 
+1

Не могли бы вы объяснить общее правило, которое должно применяться здесь? Основываясь на вашем примере ввода/вывода, можно предположить, что вы ищете способ удаления дефисов, периодов и слова foo, когда они появляются до первого периода. Это то, что вы хотите? – jahroy

+1

Можете ли вы объяснить немного больше, что вы хотите, чтобы ваше регулярное выражение работало? поэтому он берет строку «mydomain.com» или «(что-то) .mydomain.com' и всегда должен возвращать' mydomain.com', *, если только '' (что-то) 'содержит слово 'dev', в в каком случае это должно быть 'dev.mydomain.com' ?? Или вы просто хотите удалить какие-либо вхождения 'foo'? –

+0

@jahroy Я обновил вопрос с правилами использования. Может быть, вы можете отменить нижний план? – Tauren

ответ

5

Просто ради, показывая, что это можно сделать в одном регулярном выражении:

'string'.replace(/(?:(^dev).*(\.)|^.*)(mydomain\.com)/, '$1$2$3'); 

Рабочий пример: http://jsfiddle.net/gz2tX/

Вот разбивка: Это либо соответствует devчто-то., или это соответствует anything. Если он соответствует шаблону, содержащему «dev», $1 будет содержать «dev», а $2 будет содержать «.». Если он не соответствует шаблону, содержащему «dev», $1 и $2 будет пустым.($3 будет содержать «mydomain.com» в любом случае.)

Так что это возможно, но это запутанно.

Моя рекомендация - сделать что-то более читабельное и обслуживаемое, чем это. Время и боль, потраченные на выяснение этой строки, на мой взгляд, не стоит сохранять строку или две длины кода.

+0

+1 для "_do что-то более читаемое и maintanable_". Я не вижу никакой пользы от использования регулярного выражения здесь. – jahroy

+0

Хорошая работа @wiseguy! Я полностью согласен с вашими чувствами относительно удобочитаемости и ремонтопригодности. Но мой вопрос был просто простым примером того, что я действительно пытаюсь сделать. В моей ситуации имеет смысл инкапсулировать его в одно регулярное выражение. – Tauren

+3

@jahroy Чувствует себя глупо, говоря: «Вот ваш ответ, теперь, пожалуйста, не используйте его». lol – Wiseguy

1

Это трудно сказать, что вы просите ...

... Но на основе вашего ввода/вывода образца вы можете сделать следующее:

  1. расколоть вход в первый период.
  2. Если первая часть содержит слово «dev», замените его «dev».
  3. если первая часть делает NOT содержит слово dev, удалите его.

Нет необходимости в регулярном выражении, если это на самом деле что вы хотите:

function trimInput(s) { 
    var n = s.indexOf('.'); 
    if (n === -1) { 
     return s; 
    } 
    var head = s.substring(0, n); 
    if (head.indexOf("dev") !== -1) { 
     return "dev." + s.substring(n); 
    } 
    else { 
     return s.substring(n); 
    } 
} 

Если это НЕ хочу, чтобы вы хотите, пожалуйста, обновите ваш вопрос, чтобы указать, что вы хотите.

+0

Да, ваше описание объясняет, что я хочу. Но моя цель явно не ясна в том, что я хотел бы свести это в одно регулярное выражение, если это возможно. – Tauren

+3

+1 Спасибо за читаемый ответ. В большинстве ситуаций это было бы предпочтительнее. – Tauren

2

Вы можете использовать функцию для изменения значений с большим контролем в JS взамен.

var value = "dev-foo.mydomain.com".replace(/^(dev)?[^\.]+\./, function (match, p1) { 
    return p1 ? p1 + '.' : ''; 
}); 
+0

Ах, я думаю, вы здесь на решение. Ваш код не работает для 'mydomain.com' или' dev.mydomain.com', но я думаю, что это то, что я искал. – Tauren

Смежные вопросы