2014-01-15 12 views
0

Может кто-нибудь мне помочь, чтобы создать регулярные выражения на строке, мой коллега спрашивает меня об этом, но я никогда не встречал регулярных выражений для A & B или A^B.Регулярные выражения (A или A или A & B), (A, но не B)

Это мой фактический код

'(Eclipse|Sun)' => array(
        'Got' => 'Power 50', 
        'World' => 'EU'),); 

Как мне выполнить регулярные выражения, чтобы иметь возможность выбора между: «Eclipse» ИЛИ «ВС» ИЛИ «Затмение & Солнца».

Мой второй вопрос о [^] для списка, символы которого я НЕ хочу. Как я могу выполнить регулярные выражения для выражения «Eclipse [^ Oracle]» Поскольку я хочу выбрать строку с «Eclipse», но я не хочу иметь строку с «Eclipse» и «Oracle».

'Eclipse[^Oracle]' => array(
        'Note' => 'Density 200', 
        'City' => 'Prague'),); 
+0

Вы можете начать здесь [Lookahead и нулевой касательно предшествующего текста Длина утверждения] (http://www.regular-expressions.info/lookaround.html) – hwnd

+0

Я видя это, но не нашел того, чего хотел. Поскольку Oracle не привязан к Eclipse, это больше похоже на «bla oracle for bla Eclipse bla» – user3114471

+0

@hwnd У вас есть решение? или вы можете объяснить мне больше о регулярном выражении. – user3114471

ответ

1

Вопрос: Как я могу выполнять регулярные выражения, чтобы иметь выбор между: «Затмение» ИЛИ «Солнце» ИЛИ «Eclipse & Солнце».

Вы можете использовать чередование, чтобы выполнить это. Нравится так:

(Eclipse&Sun|Eclipse|Sun) 

Способ, которым работает чередование, заключается в том, что если он соответствует первому выражению, он не будет пытаться использовать второй и третий. Вы должны учитывать это при создании выражения.


Вопрос: Как я могу выполнять регулярные выражения, говоря «Затмение [^ Oracle]» Потому что я хочу, чтобы выбрать строку с «Eclipse», но я не хочу иметь строку с " Eclipse "и" Oracle ".

Ответ: Если вы хотите, чтобы соответствовать только что-то в то время как другое слово нет, вы можете использовать положительные Lookaheads для проверки строки перед сопоставлением его.Как так:

^.*(?=^.*(Eclipse))(?!^.*Oracle).*$ 
  • Матч PASS, если Eclipse, существует (?=^.*Eclipse)
    • Это место 'Затмения' в захват группы backreferenced как номер 1
  • Матч будет FAIL, если Oracle существует (?!^.*Oracle)

Regex демо здесь:

Regex101, Positive Lookaheads

+0

спасибо за вторую работу. – user3114471

0

Первое: Eclipse OR Sun OR (Eclipse AND Sun) <=> Eclipse OR Sun

if (preg_match('~\b(?:Eclipse|Sun)\b~', $str)) { 
... 
} else { ... } 

Второе: Eclipse^Oracle

if (preg_match('~(?=.*\bEclipse\b)(?!.*\bOracle\b)~', $str)) { 

(?=...) с последующим
(?!...) не сопровождается

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