【问题标题】:Javascript Regex to match only a single occurrence no more or lessJavascript正则表达式仅匹配一次出现,不多也不少
【发布时间】:2019-02-22 17:58:27
【问题描述】:

我有一个如下字符串:

single-hyphen

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

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

1. a-double-hyphen
2. nohyphen

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

提前致谢。

【问题讨论】:

  • 那么是否要求在“-”之前至少有 1 个其他字符,在“-”之后至少有 1 个其他字符?或者不,只是简单地检查字符串中的“-”?像“-asdf”或“asdf-”一样有效吗?
  • 如果需要在开头和结尾使用“-”以外的字符,那么您可以使用如下内容:jsfiddle.net/NmWTy/1 - 可能不是最有效的,也不是使用正则表达式,但这只是一个选项 - 这就是为什么它是评论,而不是答案。
  • @Ian 谢谢。我正在专门寻找我在下面找到的正则表达式。

标签: javascript regex


【解决方案1】:

你可以这样做

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

^ 描述字符串的开头

$ 描述字符串的结尾

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

【讨论】:

  • 为什么是[^-]*? 而不是[^-]*
  • 勉强匹配没有用,我会使用+ 而不是*。更好:^[^-]+-[^-]+$
  • @Tomalak:+ 版本将不匹配单个连字符位于字符串开头或结尾的大小写("-foo""foo-");但是它们是带有单个连字符的字符串,并且满足 OP 的要求(除非 OP 错误地陈述了他的目标)。
  • 是的,这行得通,因为我希望连字符在两个字符之间而不是在结尾处,但@Amadan 提出了一个很好的观点。我想我现在会使用/^[^-]*-[^-]*$/,但只是为了确定。
  • @Amadan 我假设字符串开头/结尾的单个连字符应该是无效的。不过,OP 对此并不清楚。
【解决方案2】:
/^[^-]*-[^-]*$/

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

【讨论】:

  • Java 正则表达式不使用分隔符。
  • @Tomalak:JavaScript 不是 Java。
【解决方案3】:

很奇怪(并且不是正则表达式)...但为什么不呢?

2 === str.split("-").length;

【讨论】:

  • 大声笑...是的,这就是阿甘正传的做法。我可能会像你所做的那样做,但我需要一个正则表达式。
  • @ChuckUgwuh 好吧,在这种情况下,当且仅当它是要求时,我才会使用正则表达式。
  • 是的,这是一个要求。非常感谢您的建议。和阿甘正传的参考书开玩笑吧。
【解决方案4】:

您可以使用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/

【讨论】:

    【解决方案5】:

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

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

    小提琴here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-24
      • 2018-06-28
      • 1970-01-01
      • 2015-09-19
      • 2015-09-27
      • 1970-01-01
      • 2022-10-13
      • 2016-03-18
      相关资源
      最近更新 更多