我想在构建正则表达式方面得到一些帮助。条件如下
- 表达式必须以
#
开头 - 然后它应该至少包含一组或多组由
-
分隔的字母数字字符 - 每组至少包含一个字母数字字符
- 表达式应以
-apples
或-bananas
结尾
一些测试用例
- #hshg1h2-hd212df-7632jhsd-香蕉(匹配(
- #jhkj31j-jkh213j-jjkhjj324-apples(比赛(
- hjsdjjhsd jhsshdjs jdshdsj苹果(无匹配(
- #---苹果(不匹配(
- #jhkj31j-jkh213j-jjjj324(无比赛(
- #jhkj31j-jkh213j-jjkhjj324-苹果-香蕉(无比赛(
我创建了以下表达式^#([a-zA-Z0-9]{1,}-){1,}(apples|bananas)$
。对于大多数测试用例,它提供了正确的结果。但是,它也匹配测试用例6,而它不应该匹配。
背景
测试用例模拟了苹果和香蕉这些id总是包含作为最后一个组的-bananas
或-apples
。因此,假设-apples-bananas
或反之亦然是无效的产品id。
有人能告诉我怎么做吗?
您可以使用lookahead和alternation:
/^#(?!.*apples.*bananas|.*bananas.*apples)(?=[a-zA-Z0-9]+-[a-zA-Z0-9]+).*(?:apples|bananas)$/
演示
使用单词边界断言总是很好的:
/^#(?!.*bapplesb.*bbananasb|.*bbananasb.*bapplesb)(?=[a-zA-Z0-9]+-[a-zA-Z0-9]+).*(?:bapplesb|bbananasb)$/
或者,在注释中有一个regex的修改版本(这很好!(
^#(?:(?!b(?:apples|bananas)b)[a-zA-Z0-9]+-)+b(?:apples|bananas)$
演示