我需要帮助遵循javascript和php的正则表达式规则。
JS
var charFilter = new RegExp("^[A|B].+[^0123456789]$");
PHP
if (!preg_match('/^[A|B].+[^0123456789]$/', $data_array['sample_textfield'])) {
这个正则表达式是关于
第一个字符必须以A或B开头,最后一个字符不得包含0到9.
我有另外一个验证,字符必须是最小3个字符和最多6个数字。
我要添加的新规则是,第二个字符不能是C,如果第一个字母是A.
这意味着
ADA(有效) ACA(无效)
所以我改变了像这样的正则表达式代码
JS
var charFilter = new RegExp("^(A[^C])|(B).+[^0123456789]$");
PHP
if (!preg_match('/^(A[^C])|(B).+[^0123456789]$/', $data_array['sample_textfield'])) {
它适用于第一和第二个角色。如果我输入
ACA(它说无效),但如果我输入 AD3(它表示有效),它不再检查最后一个字符。最后一个字符不能包含0到9的数字,但它显示为有效。
有人可以帮我修复那个正则表达式代码吗?非常感谢你。
答案 0 :(得分:2)
将所有要求放在一起,似乎你想要这种模式:
^(?=.{3,6}$)(?=A(?!C)|B).+\D$
那是:
^
(?=.{3,6}$)
A
后面没有C
,或者以B
(?=A(?!C)|B)
.+\D$
这将匹配(as seen on rubular.com):
= match = = no match =
ADA ACA
ABCD AD3
ABCDE ABCDEFG
ABCDEF
A123X
A X
请注意.+
和\D
允许使用空格。如果你坚持没有空格,你可以使用例如(?=\S{3,6}$)
在模式的第一部分。
(?=…)
正面前瞻;它断言给定的模式可以匹配。 (?!…)
否定前瞻;它断言给定模式可以 NOT 匹配。
原始模式的问题在于误解了交替|
说明符的优先级。
考虑以下模式:
this|that-thing
此模式由两个替代项组成,一个匹配"this"
,另一个匹配"that-thing"
。将其与以下模式进行对比:
(this|that)-thing
现在,由于分组"this-thing"
,此模式与"that-thing"
或(…)
匹配。巧合的是,它还会创建一个捕获组(它将捕获"this"
或"that"
)。如果您不需要捕获功能,但需要分组方面,请使用非捕获组``(?:...)`。
需要分组的另一个例子是重复:ha{3}
匹配"haaa"
,但(ha){3}
匹配"hahaha"
。
答案 1 :(得分:1)
你的OR反对错误的分组。尝试:
^((A[^C])|(B)).+[^0123456789]$
答案 2 :(得分:0)
我认为它应该像
/^(A[^C]|B.).*[^0-9]$/
试试这个测试代码
$test = "
A
B
AB
AC
AAA
ABA
ACA
AA9
add more
";
$pat = '/^(A[^C]|B.).*[^0-9]$/';
foreach(preg_split('~\s+~', $test) as $p)
printf("%5s : %s\n<br>", $p, preg_match($pat, $p) ? "ok" : "not ok");
答案 3 :(得分:0)
在jasonbars解决方案中,它与ABC不匹配的原因是因为它需要A后跟不是C,这是两个字符,后跟一个或多个任何字符后跟非数字。因此,如果字符串以A开头,则最小长度为4.您可以通过使用前瞻断言来解决此问题。
<强> PHP 强>
$pattern = '#^(A(?=[^C])|B).+\D$#';