仅匹配包含字母数字、连字符、下划线和句点,且没有重复标点符号的正则表达式

3

我是regex和typescript的新手,正在尝试编写一个正则表达式来匹配以下内容:

1. must start with alphanumeric (repeating is fine)
2. can contain alphanumeric (repeating is fine)
3. can contain periods, underscores, and/or hyphens (no repeating)
4. must end with alphanumeric (repeating is fine)

我是一个有帮助的助手,可以为您翻译文本。

我一直在搜索,找到了许多类似的例子,并尝试将它们调整为我需要的工作,但我还没有能够找到正确的解决方案。如果有人有一个好的正则表达式来帮助并解释为什么这样做,那就太棒了,因为我可以学习更多关于系统的知识。

以下是我正在尝试验证为可接受字符串的一些示例:

this.is.Valid
also_a_valid_1
Me-too.im_an-ugly.but_vALid-5tring

我的当前正则表达式允许一些无效的字符串,但应该失败,因为它具有重复的句点/连字符/下划线,并且在开头和结尾处有句点、连字符、下划线,以下是一些例子:

-this..should..not.be.valid....
..THIS__.-also-should..fail-
why..IS_regex--so.confusing-for-n0obs

这里是我正在使用的正则表达式示例:

 validateString(myString: string): boolean {
    return (/^[a-zA-Z0-9_\-\.]+((\.-?|-\.?)[a-zA-Z0-9_\-\.]+)*$/.test(varKey))
 }

1
您所说的“无重复”是什么意思?您想表达的是没有重复的字符吗? - MonkeyZeus
我是指不要重复标点符号。我会更新问题以更清晰明了。 - llamacorn
基本上,只允许一个句点、下划线或连字符,但不能在末尾(开头呢?)。 - wp78de
1
- llamacorn
似乎还有一个要求,就是点和破折号的顺序如何排列? - wp78de
1个回答

7

使用:

^[a-z0-9]+(?:[._-][a-z0-9]+)*$

解释:

^                   # beginning of line
  [a-z0-9]+         # 1 or more alphanum
  (?:               # start non capture group
    [._-]           # period, underscore or hyphen
    [a-z0-9]+       # 1 or more alphanum
  )*                # end group, may appear 0 or more times
$

演示

var test = [
    'this.is.Valid',
    'also_a_valid_1',
    'Me-too.im_an-ugly.but_vALid-5tring',
    '-this..should..not.be.valid....',
    '..THIS__.-also-should..fail-',
    'why..IS_regex--so.confusing-for-n0obs',
    'h',
    'sTrInG',
];
console.log(test.map(function (a) {
  return a+' :'+/^[a-z0-9]+(?:[._-][a-z0-9]+)*$/i.test(a);
}));


太好了!谢谢。你能解释一下这个部分的含义吗??: - llamacorn
这非常有帮助,感谢您提供详细的解释!由于正则表达式在实际应用中被广泛使用,我打算在本周末进行一次正则表达式学习会议。 - llamacorn
抱歉,我之前有些愚蠢,一边输入一边逐个匹配字符,现在我已经将验证移到保存操作中了。 - llamacorn
1
@llamacorn:别忘了在代码片段中添加不区分大小写的标志/.../i - Toto
1
@llamacorn:如果这个答案对你有用,请随意将其标记为已接受的答案,如何接受答案 - Toto
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接