Javascript 正则表达式匹配0或精确的字符数

Javascript 正则表达式匹配0或精确的字符数,javascript,regex,Javascript,Regex,我想用0或2个连续破折号来匹配JavaScript中的输入字符串,而不是1,即不是范围 如果字符串为: -g:“苹果”和--projectName:“葡萄”:它应该匹配--projectName:“葡萄” -g:“apple”和projectName:“grape”:它应该匹配projectName:“grape” -g:“apple”和-projectName:“grape”:它不应该匹配,即返回null --projectName:“grape”:它应该匹配--projectName:“g

我想用0或2个连续破折号来匹配JavaScript中的输入字符串,而不是1,即不是范围

如果字符串为:

  • -g:“苹果”和--projectName:“葡萄”
    :它应该匹配
    --projectName:“葡萄”
  • -g:“apple”和projectName:“grape”
    :它应该匹配
    projectName:“grape”
  • -g:“apple”和-projectName:“grape”
    :它不应该匹配,即返回null
  • --projectName:“grape”
    :它应该匹配
    --projectName:“grape”
  • projectName:“grape”
    :它应该匹配
    projectName:“grape”
  • -projectName:“grape”
    :它不应该匹配,即返回null
考虑到这个例子,为了简化这个问题,RE应该匹配前面的0或2个破折号以及接下来的任何破折号。剩下的我会弄清楚的。问题仍然归结为匹配0或2个破折号

  • 使用
    -{0,2}
    匹配0,1,2个破折号
  • 使用
    -{2,}
    匹配2个或多个破折号
  • 使用
    -{2}
    只匹配2个破折号

  • 如何匹配0或2个事件?

    答案

    如果您在空格上拆分“word-like”模式,则可以使用此正则表达式,您想要的值将位于第一个捕获组中:

    (?:^|\s)((?:--)?[^\s-]+)
    
    • \s
      是任何空格字符(制表符、空格、换行符…)
    • [^\s-]
      是除类空白字符或
      -
    再一次,问题是锚定正则表达式,因此相关部分不是完全可选的:这里锚定
    ^
    或强制空白
    \s
    起着这个作用


    我们想做什么

    基本上,您需要检查表达式(两个破折号)是否存在,因此可以使用
    运算符:

    (?:--)?
    
    “要么两个,要么没有,
    (?:…)
    是非捕获组

    避免混淆

    您希望匹配“零或两个破折号”,因此如果这是您的整个正则表达式,它将始终找到匹配项:在空字符串中、在
    --
    中、在
    -
    中、在
    foobar
    中。。。这些字符串中的匹配项将是空字符串,但正则表达式将返回匹配项

    这是一个常见的误解来源,所以请记住一条规则,如果正则表达式中的所有内容都是可选的,那么它将始终找到匹配项

    如果只希望在整个字符串由零或两个破折号组成时返回匹配项,则需要锚定正则表达式:

    ^(?:--)?$
    
    ^$
    分别匹配字符串的开头和结尾

    a(-{2})?(?!-)
    
    这是以“a”为例的。这将匹配a,后跟可选的2个破折号

    编辑:

    根据你的例子,这应该是可行的

    (?<!-)(-{2})?projectName:"[a-zA-Z]*"
    


    尝试过这个,但它也匹配1个破折号。@Eye:仍然正确,我编辑了我的答案来解释原因。我在问题中添加了一个示例。请参考。@Eye:下次请尝试从一开始就提供您想要做的事情的所有信息,这现在是一个非常不同的问题……我理解,但我的示例只是一个示例,但我希望答案更通用,以适合任何出现次数为0或精确的情况。所以你的答案不应该改变太多来回答这个问题。如果你只想抓住前面有零或两个破折号的单词,为什么不选择
    ?请更精确地说明您的规则。让我们简化一下,它应该与前面的0或2个破折号以及接下来的任何破折号匹配。剩下的我会弄清楚的。问题仍然归结为匹配的0或2个破折号。您是否可以编辑您的问题以使您的要求更清楚?还有,你用的是什么语言/正则表达式风格?该死,我应该学会写好问题。我问的问题不多,所以我在写好问题方面不是很有经验。但我在学习。^ u^。已经修改了问题并添加了标签。很容易判断,确实不那么容易做到!如果你只想要零/两个破折号之后的内容,你也应该更新你的输入示例,因为它们与你的规则不匹配(
    也会被返回)我猜风格问题,但是你觉得
    -{2}
    -
    更清楚吗?哈哈,我明白你的意思了。--在这种情况下,放“-”可能会更简单,但当我想到其中两个问题时,这只是用户乘数的习惯。这个答案在技术上应该是可行的,但在JavaScript中(对不起,我知道我没有提到这一点),这会重新生成一个错误
    SyntaxError:Invalid regular expression:unrecogned character after(?
    @Martyn,我想你的答案也会有同样的问题。因为
    [^-]
    匹配一个字符,匹配的值包括空格,但不应该包含空格。这里是。它分别通过
    (?=)
    (?!)
    支持lookaheads和否定lookaheads。
    [^-](-{2})?projectName:"[a-zA-Z]*"