我尝试编写一个函数,如果输入字符串与模式匹配则返回true,如果不匹配则返回false。听起来像是一个正则表达式的工作。
模式为:<something>:<number>-<number>;
其中<something>
可以是字母或数字的任意组合或空白。模式可以在输入字符串中重复任意次,;
对于模式的最后一次重复是可选的。
所以这些将返回true:
但这些会返回false:
我已经知道该模式的一次重复可用
表示 [\w\d\s]*:\d+-\d+;?
但是我很难找到如何确定整个字符串是否仅仅依赖于该模式的重复。
我已经尝试过多种方法,包括使用( )+
和/或^ $
包围模式,但仍会遇到问题。什么是在JavaScript中检查字符串是否仅由一个模式组成,重复一次或多次的最佳方法?
答案 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+(?:;?$|;))+$/
我们在每组结尾处跟踪;
可选:
[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