构建以一个单词或另一个单词结尾的正则表达式



我想在构建正则表达式方面得到一些帮助。条件如下

  • 表达式必须以#开头
  • 然后它应该至少包含一组或多组由-分隔的字母数字字符
  • 每组至少包含一个字母数字字符
  • 表达式应以-apples-bananas结尾

一些测试用例

  1. #hshg1h2-hd212df-7632jhsd-香蕉(匹配(
  2. #jhkj31j-jkh213j-jjkhjj324-apples(比赛(
  3. hjsdjjhsd jhsshdjs jdshdsj苹果(无匹配(
  4. #---苹果(不匹配(
  5. #jhkj31j-jkh213j-jjjj324(无比赛(
  6. #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)$

演示

相关内容

最新更新