javascript - 匹配正则表达式模式仅计算单词列表中的唯一值
问题描述
我正在尝试解析如下所示的字符串:
1p+3m-2u+21d
3p+1m-2u
我的规则是这样的:
- 一个字符前面必须有一个数字。
- 'p'、'm'、'u' 和 'd' 中的任何一个都是可选的,但必须始终按该顺序出现。
- 这四个字符中的每一个只能使用一次。
- 必须至少出现一次数字和字符。
- 每个成对出现的数字和四个字母之一必须用加号或减号运算符分隔。
我目前的进度是这样的(使用 Javascript Regex 引擎):
^([+-][0-9]+[pmud]){1,4}$
这遵循我上面的所有规则,除了每个字符的单次出现。我如何重写我的模式以反映这种排他性?
如果这不能通过正则表达式反映,是否有另一种使用 Javascript 编写匹配的方法?
解决方案
您可以在此处使用可选组,并确保该模式不匹配带有一些前瞻的空字符串。
/^(?!$|[-+])(?:\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
.$
- 字符串结束。
推荐阅读
- python - Pandas 合并方法返回空数据框
- r - 将每一行与对应的列合并,形成一个垂直表格
- angular - 如何使用ActivatedRoute获取url参数?
- php - 将字符串闭包评估为“真正的”闭包
- python - 当我尝试运行 container.inside() 方法时,Jenkins 挂起
- haskell - 如何从列表中删除一个元素及其所有重复项?
- excel - sql表名中的空格
- java - 在 Activity 中点击 Fragment
- c# - 如何在 ASP.NET Core 中动态过滤 Razor 页面的视图模型?
- powershell - Powershell 在 pgp 解密时失败