您好,我正在尝试为具有以下约束的字符串构建正则表达式:
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
感谢您的时间。
答案 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+ T
,O
,X
,;
,_
字符$
-字符串的结尾。基于交替的非环视方法也是可能的:
^[X;_]*(?:T[X;_]*O|O[X;_]*T)[X;_]*$
请参见regex demo。
详细信息
^
-字符串开头[X;_]*
-0+ T
,O
,X
,;
,_
字符(?:T[X;_]*O|O[X;_]*T)
-两种选择之一:
T[X;_]*O
-T
,任意0+ T
,O
,X
,;
,_
字符,{ {1}} O
-或|
-O[X;_]*T
,任意0+ O
,T
,O
,X
,;
字符,{ {1}} _
-0+ T
,[X;_]*
,T
,O
,X
字符;
-字符串结尾。