JavaScript:检查整个字符串是否由可重复的模式组成

时间:2017-03-13 20:55:02

标签: javascript regex

我尝试编写一个函数,如果输入字符串与模式匹配则返回true,如果不匹配则返回false。听起来像是一个正则表达式的工作。

模式为:<something>:<number>-<number>;

其中<something>可以是字母或数字的任意组合或空白。模式可以在输入字符串中重复任意次,;对于模式的最后一次重复是可选的。

所以这些将返回true:

  • ABC:1-2; CDE:3-4
  • ABC:1-2; CDE:3-4;
  • ABC:1-2
  • :1-2

但这些会返回false:

  • ABC:1-2;猫; CDE:3-4
  • ABC:1-2; CDE:3-4;猫

我已经知道该模式的一次重复可用

表示

[\w\d\s]*:\d+-\d+;?

但是我很难找到如何确定整个字符串是否仅仅依赖于该模式的重复。

我已经尝试过多种方法,包括使用( )+和/或^ $包围模式,但仍会遇到问题。什么是在JavaScript中检查字符串是否仅由一个模式组成,重复一次或多次的最佳方法?

3 个答案:

答案 0 :(得分:3)

您可以使用以下表达式:

/^[\w\s]*:\d+-\d+(?:;[\w\s]*:\d+-\d+)*;?$/

请参阅regex demo

<强>详情:

  • ^ - 字符串开头
  • [\w\s]* - 零个或多个单词或空白字符
  • : - 冒号
  • \d+-\d+ - 一位或多位数,-以及一位或多位数字
  • (?:;[\w\s]*:\d+-\d+)* - 0个或更多序列:
    • ; - 分号
    • [\w\s]*:\d+-\d+ - 上述模式
  • ;? - 1或0 ;
  • $ - 字符串结束。

请注意,[\w\d]\w的文字相同,因此,我建议从\d删除[\w\s]

答案 1 :(得分:1)

您可以使用这个更简单的正则表达式:

/^(?:[a-zA-Z0-9]*:\d+-\d+(?:;?$|;))+$/

RegEx Demo

我们在每组结尾处跟踪;可选:

[a-zA-Z0-9]*:\d+-\d+;?这匹配0个或更多字母数字后跟:后跟数字 - 连字符数字。

答案 2 :(得分:0)

你需要使用+量词。尝试下一种方法:

function test(str) {
    return /^([\w\s]*:\d+-\d+;?)+$/.test(str)
  }
  console.log(test('ABC:1-2;CDE:3-4'));//true
  console.log(test('ABC:1-2;CDE:3-4;'));//true
  console.log(test('ABC:1-2'));//true
  console.log(test(':1-2'));//true
  console.log(test('ABC:1-2;cats;CDE:3-4'));//false
  console.log(test('ABC:1-2;CDE:3-4;cats'));//false