在Regular Expression to Match Blood Group方面需要帮助

时间:2009-06-17 08:32:56

标签: regex

我正在尝试提出一个正则表达式来帮助我验证血型字段 - 它应该只接受A [+ - ],B [+ - ],AB [+ - ]和O [+ - ]。

这是我提出的正则表达式(并使用 Regex Tester 进行测试):

[A|B|AB|O][\+|\-]

现在这个模式成功地匹配A,B,O [+ - ]但是对AB [+ - ]失败。

任何人都可以建议一个符合我目的的正则表达式吗?

谢谢, 米^ E

5 个答案:

答案 0 :(得分:16)

尝试:

(A|B|AB|O)[+-]

使用方括号定义character class,它只能是单个字符。括号create a grouping允许它做你想做的事。您也不需要转义字符类中的+-,因为它们内部没有它们的regexy含义。

正如您在评论中提到的,如果它是您要匹配的字符串,并且具有您要查找的确切值,您可能希望这样做:

^(A|B|AB|O)[+-]$

如果没有start of string and end of string anchors,“helloAB + asdads”之类的东西就会匹配。

答案 1 :(得分:2)

括号[]表示一个字符类,意思是“此处的任何字符”。您想要括号()进行分组:

(A|B|AB|0)(\+|-)

答案 2 :(得分:2)

当您构建替换(例如(A|B|AB|O))时,您应该注意元素的排序。许多正则表达式引擎将在第一个匹配(而不是最长)的备用站点停止。如果不是[-+]强制退回,(A|B|AB|O)[-+]将不适用于"AB+"。说(AB|A|B|O)[-+]可能更好(但你应该检查你的正则表达式引擎的文档)。

此外,如果您不打算为后者使用捕获抗原,则应使用非捕获分组括号:(?:AB|A|B|O)[-+]

此外,如果你想确保字符串中唯一的东西是血型,那么你需要锚点来阻止它只匹配字符串的一部分:^(?:AB|A|B|O)[-+]$。关于锚点的快速说明,如果您传递多线匹配选项,^可能会匹配行的开头而不是字符串的开头,具体取决于您的正则表达式引擎。类似地,$可以匹配行的结尾而不是字符串的结尾。出于这个原因,还有三个共同的锚(但不是%100)用法:\A\Z\z。如果您的正则表达式引擎支持它们,\A始终匹配字符串的开头,\Z匹配字符串的结尾或字符串结尾之前的换行符,\z仅匹配发送字符串。

答案 3 :(得分:0)

^(A | B | AB | O)[+ - ] $? 这将产生正确的输出。

答案 4 :(得分:0)

对于html模式属性中不区分大小写的情况,您可以尝试使用

([AaBbOo]|[Aa][Bb])[\+-]


<input type="text" maxlength="3" pattern="([AaBbOo]|[Aa][Bb])[\+-]" required />