Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 匹配正则表达式模式只计算单词列表中的唯一值_Javascript_Regex - Fatal编程技术网

Javascript 匹配正则表达式模式只计算单词列表中的唯一值

Javascript 匹配正则表达式模式只计算单词列表中的唯一值,javascript,regex,Javascript,Regex,我正在尝试解析如下所示的字符串: 1p+3m-2u+21d 3p+1m-2u 我的规则如下: 字符前面必须有数字 “p”、“m”、“u”和“d”中的任何一个都是可选的,但必须始终按该顺序出现 这四个字符只能使用一次 数字和字符必须至少出现一次 每个成对出现的数字和四个字母中的一个必须用加号或减号运算符分隔 我当前的进度如下(使用Javascript正则表达式引擎): 除了每个字符出现一次之外,这遵循我上面的所有规则。我如何重写我的模式以反映这种排他性 如果正则表达式无法反映这一点,是否有其

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

1p+3m-2u+21d
3p+1m-2u
我的规则如下:

  • 字符前面必须有数字
  • “p”、“m”、“u”和“d”中的任何一个都是可选的,但必须始终按该顺序出现
  • 这四个字符只能使用一次
  • 数字和字符必须至少出现一次
  • 每个成对出现的数字和四个字母中的一个必须用加号或减号运算符分隔
我当前的进度如下(使用Javascript正则表达式引擎):

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


如果正则表达式无法反映这一点,是否有其他方法可以使用Javascript编写匹配项?

您可以在此处使用可选组,并确保模式不匹配具有某种前瞻性的空字符串

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

详细信息

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

  • 3p+4u
    有效吗?是的,只要字符串中至少有一个字符,省略这四个字符中的任何一个都是有效的。效果很好,谢谢你的回答和很好的解释。@UndingJellyfish我突然想到:如果你不想匹配
    +2m
    ,请使用
    (?!$[-+])
    向前看。我更新了答案。+2m是我没有考虑过的行为,将不得不向我的团队中的其他人询问。@UndingJellyfish好吧,每个成对出现的数字和四个字母中的一个必须由加号或减号运算符分隔。要求听起来好像
    +
    -
    只能出现在单元之间。
    /^(?!$|[-+])(?:\d+p)?(?:(?:^|[+-])\d+m)?(?:(?:^|[+-])\d+u)?(?:(?:^|[+-])\d+d)?$/