首页 > 解决方案 > 匹配正则表达式模式仅计算单词列表中的唯一值

问题描述

我正在尝试解析如下所示的字符串:

1p+3m-2u+21d
3p+1m-2u

我的规则是这样的:

我目前的进度是这样的(使用 Javascript Regex 引擎):

^([+-][0-9]+[pmud]){1,4}$

这遵循我上面的所有规则,除了每个字符的单次出现。我如何重写我的模式以反映这种排他性?

如果这不能通过正则表达式反映,是否有另一种使用 Javascript 编写匹配的方法?

标签: javascriptregex

解决方案


您可以在此处使用可选组,并确保该模式不匹配带有一些前瞻的空字符串。

/^(?!$|[-+])(?:\d+p)?(?:(?:^|[+-])\d+m)?(?:(?:^|[+-])\d+u)?(?:(?:^|[+-])\d+d)?$/

查看正则表达式演示

细节

  • ^- 字符串的开头
  • (?!$|[-+])- 不允许空字符串(必须至少存在一个“单位”)并且 no-并且+可以出现在开头
  • (?:\d+p)?- 一个可选的 1+ 数字序列,后跟p
  • (?:(?:^|[+-])\d+m)?- 字符串开头的可选序列或-/+后跟 1+ 位数字,后跟m
  • (?:(?:^|[+-])\d+u)?- 字符串开头的可选序列或-/+后跟 1+ 位数字,后跟u
  • (?:(?:^|[+-])\d+d)?- 字符串开头的可选序列或-/+后跟 1+ 位数字,后跟d.
  • $- 字符串结束。

推荐阅读