Javascript Regex只匹配一次出现,不多也不少

IT技术 javascript regex
2021-03-05 14:01:58

我有一个像下面这样的字符串:

single-hyphen

我需要匹配连字符。但是,我只想匹配一次出现的连字符,不多也不少。

所以上面的字符串将返回true,但下面的两个将是false:

1. a-double-hyphen
2. nohyphen

我如何定义一个正则表达式来做到这一点?

提前致谢。

5个回答

你可以这样做

/^[^-]+-[^-]+$/

^ 描述字符串的开始

$ 描述字符串的结尾

[^-]+ 匹配 1 到多个字符,除了 -

不情愿的匹配没有用,我会使用+代替*更好的:^[^-]+-[^-]+$
2021-04-20 14:01:58
是的,这是有效的,因为我希望连字符在两个字符之间而不是结尾,但 @Amadan 提出了一个很好的观点。我想我/^[^-]*-[^-]*$/现在会使用,但只是为了确定。
2021-04-21 14:01:58
@Amadan 我假设字符串开头/结尾的单个连字符应该是无效的。不过,OP 对此并不清楚。
2021-05-02 14:01:58
为什么[^-]*?[^-]*
2021-05-10 14:01:58
@Tomalak:+当单个连字符位于字符串 ( "-foo", "foo-")的开头或结尾时,版本将不匹配大小写但它们是带有单个连字符的字符串,并且满足 OP 的要求(除非 OP 错误说明了他的目标)。
2021-05-19 14:01:58
/^[^-]*-[^-]*$/

字符串的开头、任意数量的非连字符、一个连字符、任意数量的非连字符、字符串的结尾。

Java 正则表达式不使用分隔符。
2021-05-06 14:01:58
@Tomalak:JavaScript 不是 Java。
2021-05-11 14:01:58

奇怪(而不是 Regex)......但为什么不呢?

2 === str.split("-").length;
大声笑......是的,这就是阿甘正传的方式。我可能已经做到了与您所做的类似,但我需要一个正则表达式。
2021-04-23 14:01:58
@ChuckUgwuh 好吧,在这种情况下,当且仅当它是一个要求时,我才会使用正则表达式
2021-05-16 14:01:58
是的,这有点像一个要求。不过非常感谢你的建议。也只是在玩阿甘参考。
2021-05-18 14:01:58

你可以使用的组合indexOflastIndexOf

String.prototype.hasOne = function (character) {
    var first = this.indexOf(character);
    var last = this.lastIndexOf(character);

    return first !== -1 &&
        first === last;
};

'single-hyphen'.hasOne('-'); // true
'a-double-hyphen'.hasOne('-'); // first !== last, false
'nohyphen'.hasOne('-'); // first === -1, false

http://jsfiddle.net/cSF8T/

非常规,但它有效。它不操作字符串或使用正则表达式。

 // only true if only one occurrence of - exists in string
 (str.indexOf("-") + 1) % ( str.lastIndexOf("-") + 1 ) === 0

在这里摆弄