第一和第二字符的正则表达规则

时间:2010-08-13 07:44:38

标签: php javascript regex

我需要帮助遵循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的数字,但它显示为有效。

有人可以帮我修复那个正则表达式代码吗?非常感谢你。

4 个答案:

答案 0 :(得分:2)

将所有要求放在一起,似乎你想要这种模式:

^(?=.{3,6}$)(?=A(?!C)|B).+\D$

那是:

  • 从字符串^
  • 的开头
  • 我们可以断言字符串(?=.{3,6}$)
  • 的结尾有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$#';