更好的编写正则表达式的方法

8

所以,我一直在尝试写出一个正则表达式,用于匹配电阻值,它包含一定数量的数字和最多一个字母,并且总长度始终是一定的(让我们使用四个字符的电阻代码作为示例)。

首先,我可以使用'\d*[RKM]\d*',但这会允许像'R'这样的内容。

另外,我可以做类似'[\dRKM]{4}'的事情,但这将允许像'RRR4'这样的内容,这不是我想要的值。

'\d{1,4}[Rr]\d{0,3} | ([RKM]\d{3}) | (\d{4})',虽然更具体,但仍会允许像'1234R567'这样不是四个字符的内容。

因此,基本上,有没有更紧凑的方式来编写'[RKM]\d\d\d | \d[RKM]\d\d | \d\d[RKM]\d | \d\d\d[RKM] | \d\d\d\d'


3
我不确定你是否愿意做这件事,但也许检查长度的最好方法是使用周围的编程语言。我们公司在一个XML文件中列出了“验证类型”,并且除了每个验证类型的正则表达式外,还可以设置最小/最大长度。(在这种情况下,只需将两者都设置为4)。 - Katana314
1
^[RKM]\d{3}|\d[RKM]\d{2}|\d{2}[RKM]\d|\d{3}[RKM]|\d{4}$ 太复杂了吗?或者,如果您在其他文本中查找:\b(?:[RKM]\d{3}|\d[RKM]\d{2}|\d{2}[RKM]\d|\d{3}[RKM]|\d{4})\b - Brad Christie
1个回答

9

根据你使用的正则表达式语法,你可以使用前瞻:

^(?!(?:\d*\D){2})[\dRKM]{4}$
  • (?!(?:\d*\D)) - 表示不存在两个非数字字符。

或者:

^(?=.{4}$)\d*(?:[RKM]\d*)?$
  • (?=.{4}$) - 断言字符串的长度为4。

参见:正则表达式:是否有AND运算符?


+1 我正在研究一种使用前瞻的相对丑陋的版本:^(?=.*[RKM])(?=(.*\d){3})[\dRKM]{4}$(甚至是 ^(?=.*[RKM])(?=(.*\d){3}).{4}$)。 - jensgram
太棒了@Kobi。谢谢你提供的链接。如果可以的话,我会给你+2的评分。 - Daniel Gimenez
@jensgram - 谢谢。记住字母是可选的:1234 也应匹配。 - Kobi
@Kobi 哦,没注意到。请忽略我上面的评论 :) - jensgram
你的第一个模式匹配是 1234 - Casimir et Hippolyte
@Casimir - 两个模式都匹配“1234”- Marcus在他的模式中有一个\d\d\d\d交替。 - Kobi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接