我正在尝试提出一个正则表达式来帮助我验证血型字段 - 它应该只接受A [+ - ],B [+ - ],AB [+ - ]和O [+ - ]。
这是我提出的正则表达式(并使用 Regex Tester 进行测试):
[A|B|AB|O][\+|\-]
现在这个模式成功地匹配A,B,O [+ - ]但是对AB [+ - ]失败。
任何人都可以建议一个符合我目的的正则表达式吗?
谢谢, 米^ E
答案 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 />