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