【问题标题】:How to allow only certain words consecutively with Regex in javascript如何在javascript中使用Regex连续只允许某些单词
【发布时间】:2017-11-13 15:38:11
【问题描述】:

我正在尝试编写一个正则表达式,如果它与下面的格式匹配,它将返回true,否则,它应该返回false。它应该只允许以下单词:

正匹配(返回真)

UA-1234-1,UA-12345-2,UA-34578-2

否定匹配(返回 false 或 null)

注意:AU 之后丢失

UA-1234-1,U-12345-2

当传递给正则表达式的字符串是 UA-1234-1,UA-12345-2,UA-34578-2,...........

下面是我想要做的,但它只匹配第一个元素而不返回 null。

var pattern=/^UA-[0-9]+(-[0-9]+)?/g;

pattern.match("UA-1234-1,UA-12345-2,UA-34578-2");

pattern.exec("UA-1234-1,UA-12345-2,UA-34578-2)

提前致谢。非常感谢您的帮助。

【问题讨论】:

  • 是的,非常感谢@Wiktor Stribizew

标签: javascript regex search design-patterns match


【解决方案1】:

您需要的模式是一个用锚(^ - 字符串开头和$ - 字符串结尾)包围的模式,它首先匹配您的模式(初始“块”),然后匹配 0 次或多次出现的, 后跟块模式。

看起来像/^BLOCK(?:,BLOCK)*$/。您可以在两者之间引入可选的空格,例如/^BLOCK(?:,\s*BLOCK)*$/.

最后,模式看起来像^UA-[0-9]+(?:-[0-9]+)?(?:,UA-[0-9]+(?:-[0-9]+)?)*$。最好动态构建它以保持可读性和易于维护:

const block = "UA-[0-9]+(?:-[0-9]+)?";
let rx = new RegExp(`^${block}(?:,${block})*$`); // RegExp("^" + block + "(?:," + block + ")*$") // for non-ES6
let tests = ['UA-1234-1,UA-12345-2,UA-34578-2', 'UA-1234-1,U-12345-2'];
for (var s of tests) {
  console.log(s, "=>", rx.test(s));
}

【讨论】:

  • 非常感谢@Wiktor Stribiżew
【解决方案2】:

用逗号分割字符串,然后测试每个元素。

【讨论】:

猜你喜欢
  • 2011-10-15
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多