Еще одно регулярное выражение с отрицанием

Вроде бы простая проблема, но не могу найти решение. Я надеялся, что негативный прогноз поможет, но это не так. В такой строке:

AYB AXZB AZB

я хочу сопоставить комбинацию A и B с X между ними и что-нибудь еще, кроме не другого A или B. То есть я смогу найти «AXZB» только в строке выше . A, X и B не просто символы в реальном примере, поэтому отрицание не вариант.

Обновление:

Уточнение требований - как указано выше, A, X и B - это не просто символы, а многосимвольные шаблоны, поэтому [^AB] не вариант.

Правильный ответ:

(A(?:(?!(A|B)).)*?X(?:(?!(A|B)).)*?B)

person AndreiM    schedule 13.01.2015    source источник
comment
Каковы правила? AYB и AZB между ними нет другого A или B .. Если X должен постоянно находиться, вы, вероятно, могли бы сделать A[^AB]*X[^AB]*B   -  person hwnd    schedule 13.01.2015
comment
Вы имеете в виду это \bA\S*X\S*B\b ?   -  person Avinash Raj    schedule 13.01.2015
comment
я не понимаю, что вы имеете в виду..   -  person prospector    schedule 13.01.2015
comment
Какой язык вы используете?   -  person Drazzah    schedule 13.01.2015
comment
Разве он не должен найти AAXB? Должны ли A и B быть первыми/последними?   -  person Bohemian♦    schedule 13.01.2015
comment
Между AYB и AZB нет X, поэтому они не совпадают. AAXB не должен совпадать, а AXB должен.   -  person AndreiM    schedule 13.01.2015
comment
Я использую Java, но я думаю, что язык здесь не имеет значения   -  person AndreiM    schedule 13.01.2015
comment
Можете ли вы привести пример того, как A и B могут выглядеть как многосимвольные шаблоны?   -  person David Faber    schedule 13.01.2015
comment
‹A› и ‹B›, например, что может быть вместо A и B   -  person AndreiM    schedule 13.01.2015
comment
пожалуйста, приведите реальный пример   -  person alpha bravo    schedule 13.01.2015


Ответы (4)


как насчет этого простого шаблона

A\S*X\S*B

Демо


на основе комментария ниже используйте этот шаблон

(A(?:(?!A).)*?X(?:(?!B).)*?B)  

Демо

person alpha bravo    schedule 13.01.2015
comment
Это не сработает, так как (а) допускаются пробелы между A и B, и (б) для измененной строки AYBAXZBAZB этот шаблон будет соответствовать всей строке - person AndreiM; 13.01.2015
comment
@AndreiM, обновлено выше - person alpha bravo; 13.01.2015
comment
Спасибо @alpha bravo, вы очень близко подошли к правильному ответу, я немного изменил и принял ваш ответ - person AndreiM; 14.01.2015

Попробуйте что-нибудь вроде /a[^ab\s]?x[^ab\s]?b/i. Это будет соответствовать любому «a», а затем любым символам (кроме другого «a», «b» или пробела) до «b», если где-то там есть «x».

Вот пример использования JavaScript.

var string = 'AyB AXB AxB blabla'; // change this string to test the regex

if (string.match(/a[^ab\s]?x[^ab\s]?b/i)) {
  alert('The string found this match: ' + /a[^ab\s]?x[^ab\s]?b/i.exec(string));
} else {
  alert('There was no match found in the string.');
}

Отредактируйте и протестируйте здесь: https://regex101.com/r/hO3qY3/2.

person Drazzah    schedule 13.01.2015
comment
Это не сработает по той причине, что A и B - это не просто символы в соответствии с требованиями. - person AndreiM; 13.01.2015

Попробуй это:

\bA(?=\S*?X)[^AB]*?B\b
person Andie2302    schedule 13.01.2015
comment
Извините, но это не сработает, поскольку A и B — это не просто символы, поэтому [^AB] не подходит. - person AndreiM; 13.01.2015

A\S*X\S*B

Попробуйте это простое регулярное выражение. См. демонстрацию.

https://regex101.com/r/sH8aR8/50

person vks    schedule 13.01.2015