正则表达式“ OR”似乎不符合预期

时间:2019-02-22 21:09:36

标签: regex

您好,我正在尝试为具有以下约束的字符串构建正则表达式:

 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 :(得分:1)

如果可以使用先行记录,则可以使用

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

请参见regex demo

详细信息

  • ^-字符串的开头
  • (?=[^O]*O[^O]*$)-除O之外,必须有0+个字符,然后是O,然后是O以外的0+个字符,直到结束为止字符串
  • (?=[^T]*T[^T]*$)-除T之外,必须有0+个字符,然后是T,然后是T以外的0+个字符,直到结束为止字符串
  • [TOX;_]*-0+ TOX;_字符
  • $-字符串的结尾。

基于交替的非环视方法也是可能的:

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

请参见regex demo

详细信息

  • ^-字符串开头
  • [X;_]*-0+ TOX;_字符
  • (?:T[X;_]*O|O[X;_]*T)-两种选择之一:
    • T[X;_]*O-T,任意0+ TOX;_字符,{ {1}}
    • O-或
    • |-O[X;_]*T,任意0+ OTOX;字符,{ {1}}
  • _-0+ T[X;_]*TOX字符
  • ;-字符串结尾。