【问题标题】:JavaScript: check if entire string is made up of repeatable patternJavaScript:检查整个字符串是否由可重复的模式组成
【发布时间】:2017-03-13 20:55:02
【问题描述】:

我正在尝试编写一个函数,如果它的输入字符串与模式匹配则返回 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;cats;CDE:3-4
  • ABC:1-2;CDE:3-4;猫

我知道模式的一个重复可以用

表示

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

但我正在努力寻找如何确定整个字符串是否仅由该模式的重复组成。

我尝试了几件事,包括用( )+ 和/或^ $ 包围模式,但一直遇到问题。在 JavaScript 中检查字符串是否仅由重复一次或多次的模式组成的最佳方法是什么?

【问题讨论】:

  • 嗯,用( )+ 包围它应该可以工作。除非; 字符后有 1 个或多个空格或换行符。
  • 这个ABC:1-2CDE:3-4和这个ABC:1-2 CDE:3-4FGH : 77 - 77是真是假?
  • @KodosJohnson 用 ( )+ 包围它的问题是,第一个失败,即中间有猫的失败,对于 equals() 函数来说是正确的,因为它找到了两个单独的匹配序列,并且没有 match() javascript 等效于测试整个字符串。
  • @ibrahimmahrir 我希望这些都是真的,但这并不是完全必要的。不过,很好的收获。接受空间正在待办事项列表中。

标签: javascript regex


【解决方案1】:

您可以使用以下表达式:

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

regex demo

详情

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

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

【讨论】:

  • @ibrahimmahrir - ; 对于模式的最后重复是可选的
  • 实际上,我应该稍微改变一下演示:用空格替换\s(因为它是一个多行字符串,而不是单独的字符串)。仅用于说明 - regex101.com/r/yIZmwq/3.
  • 我知道演示中的多行标志只是为了说明,但答案中是否故意省略了全局标志?
  • 我没有包括它,因为我想您正在一一处理字符串。或者你有一个多行字符串输入?
【解决方案2】:

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

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

RegEx Demo

我们在每组的末尾保留; 可选,即:

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

【讨论】:

  • 是的,我理解这个问题应该是一个有效的匹配。
  • ; 对于模式的最后重复 是可选的
  • 我相信你知道你的模式没有遵循哪两个最佳实践。此外,它也不符合OP的需求。
  • 是的,使用$ 两次可能看起来很奇怪,但它避免了重复子模式[a-zA-Z0-9]*:\d+-\d+ 并保持正则表达式更短。
  • 我不是那个意思。您还应该知道“更短”并不意味着“高效”。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 2016-02-18
    相关资源
    最近更新 更多