Регулярное выражение «ИЛИ» ведет себя не так, как ожидалось - PullRequest
0 голосов
/ 23 февраля 2019

Здравствуйте, я пытаюсь построить регулярное выражение для строки со следующими ограничениями:

 should only contain 'X', 'O', 'T', '_', ';' 
 'T' and 'O' should occur only once and can be anywhere in the string
  'X', '_', ';'  may occur zero to n times

Вот несколько допустимых примеров:

"X__;O_T;___"
"T__;_XX_;_XO"
"T__;OX_;_X_"
"OT"

Это регулярное выражение, которое я имею правосейчас:

/^([X;_]*T[X;_]*O)|([X;_]*O[X;_]*T);$ */i

Похоже, что вышеприведенный ввод правильного значения ниже:

T__;_X__OO; //which is not valid

Спасибо за ваше время.

1 Ответ

0 голосов
/ 23 февраля 2019

Если вы можете использовать прогноз, вы можете использовать

^(?=[^O]*O[^O]*$)(?=[^T]*T[^T]*$)[TOX;_]*$

См. regex demo

Подробности

  • ^ - начало строки
  • (?=[^O]*O[^O]*$) - должно быть 0+ символов, отличных от O, затем O, а затем любые 0+ символов, кроме O upдо конца строки
  • (?=[^T]*T[^T]*$) - должны быть любые 0+ символов кроме T, затем T, а затем любые 0+ символов, кроме T до концастрока
  • [TOX;_]* - 0+ T, O, X, ;, _ символов
  • $ - конец строки.

Возможен также неумышленный подход, основанный на чередовании:

^[X;_]*(?:T[X;_]*O|O[X;_]*T)[X;_]*$

См. Демонстрацию regex .

Подробнее

  • ^ - начало строки
  • [X;_]* - 0+ T, O, X, ;, _ символов
  • (?:T[X;_]*O|O[X;_]*T) - любой из двух вариантов:
    • T[X;_]*O - T, любой 0+ T, O, X, ;, _ символы O
    • | - или
    • O[X;_]*T - O, любой 0+ T, O, X, ;, _ символов, T
  • [X;_]* - 0+ T, O, X, ;, _ символов
  • $ - конец строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...