2016-06-20 4 views
0

Я пытаюсь написать регулярное выражение в JavaScript, что ANDs два условия A и BКак совместить два регулярных выражения?

(A)(B), очевидно, недействительное решение.

Мои два регулярных выражений являются:

^((?=.*?(.*([\.]).*)[^@])[^@]+)$

^((?!\.\.).)*$


так ^((?=.*?(.*([\.]).*)[^@])[^@]+)(((?!\.\.).)*)$ нет и двух регулярных выражений

Как я могу это сделать? существует ли общее правило?

+3

Вы уже, кажется, знают lookaheads, так ... '(? = A) (?: B) ' –

+0

'^(? =. *? (. * ([\.]). *) [^ @]) (?! \. \.). [^ @] + $ ' –

ответ

1

Вы можете комбинировать их, как следующий

^(?=.*?(.*([\.]).*)[^@])((?!\.\.)[^@])+$ 

Regex explanation here.

Regular expression visualization

+0

Спасибо за это время потраченный на анализ регулярных выражений, но этот ответ не дает достоверных результатов, поскольку он соответствует 'example..com' Также искал более общий ответ –

+0

@AymanJitan: я только что обновил регулярное выражение ... –

2

Иногда, не существует очевидный способ объединить выражения. Как вы сказали, (A)(B) недействителен. Поскольку регулярные выражения не язык программирования, «очевидный» способ сделать то, что вы ищете это:

var doesMatch = string.match(/(A)/) && string.match(/(B)/); 

, не теряя времени, чтобы действительно расшифровать то, что вы пытаетесь соответствовать, это трудно скажем, если есть неочевидный способ объединить два выражения ... все, что я могу сказать, не существует общего правила для их объединения.

Кроме того, объединение двух регулярных выражений не обязательно означает, что это быстрее. Возьмите строку foo bar и выражения ^foo и bar$. «Очевидная» комбинация этих двух выражений - ^foo.*?bar$; однако ^foo и bar$ каждый шаг занимает 5 шагов, а комбинированная версия занимает 11 шагов.

+1

« Не теряя времени чтобы действительно расшифровать ... «Подумайте, сколько еще потребуется времени, чтобы расшифровать * после того, как они объединены. По этой причине я предпочитаю подход &&. +1 – bmb

0

Попробуйте разбить его до фактических условий, на которые вы тестируете; Я вижу три из них:

  • содержит, по меньшей мере, одна точка (.)
  • не содержит двойную точку (..)
  • один или более любых символов, кроме @

Преобразуйте два из них в lookaheads, затем соедините все три вместе в одно регулярное выражение. Это будет:

^(?=.*\.)(?!.*\.\.)[^@]+$ 

Но, возможно, вы хотите быть уверены, что оно не начинается и не заканчивается точкой. Это легче сделать без lookaheads:

^[^@.]+(?:\.[^@.]+)+$ 
Смежные вопросы