regex 如何编写一个正则表达式,使其既符合此模式,又允许一个字符到任意数量的字符

xv8emn3q  于 2023-03-20  发布在  其他
关注(0)|答案(3)|浏览(98)

我需要一个正则表达式,可以包含拉丁字母,数字,下划线(_),减号(-),并且点(.)符号,但点符号不能用作第一个或最后一个符号。我认为我需要使用某种量词,因为我现在的模式只能处理3个或更多字符。我需要它即使只处理一个字符,它不能是(.)点符号。请参阅下面我的当前模式:

const emailAcctName = /^[a-zA-Z0-9_-]+[a-zA-Z0-9._-]+[a-zA-Z0-9_-]$/;
xwbd5t1u

xwbd5t1u1#

图案:

const emailAcctName = /^(?!^\.)(?!.*\.$)[a-zA-Z0-9._-]+$/;

解释:

^               Start of string
(?!^\.)         Negative lookahead: Do not match if the string starts with a period
(?!.*\.$)       Negative lookahead: Do not match if the string ends with a period
[a-zA-Z0-9._-]+ Match one or more Latin letters, digits, underscore, hyphen, or period symbols
$               End of string

测试:

const emailAcctName = /^(?!^\.)(?!.*\.$)[a-zA-Z0-9._-]+$/;

console.log(emailAcctName.test("jane_.doe")); // true
console.log(emailAcctName.test("jane.doe_")); // true
console.log(emailAcctName.test("jane-doe.")); // false
console.log(emailAcctName.test("a.b")); // true
console.log(emailAcctName.test(".jane-doe")); // false
kg7wmglp

kg7wmglp2#

匹配第一个字符,然后是任意数量的内部字符和最后一个字符的可选匹配。
/^[a-zA-Z0-9_-](?:[a-zA-Z0-9._-]*[a-zA-Z0-9_-])?$/

  • ^与字符串的开头匹配
  • [a-zA-Z0-9_-]匹配一个或多个拉丁字母、数字、下划线或减号
  • [a-zA-Z0-9_.-]匹配一个或多个拉丁字母、数字、下划线或减号以及点
  • (?:[a-zA-Z0-9._-]*[a-zA-Z0-9_-])?匹配零个或一个重复的非捕获组,该组包含任意数量的指定字符(包括点),后跟一个指定字符(不包括点)
  • $匹配字符串的结尾
const pattern = /^[a-zA-Z0-9_-](?:[a-zA-Z0-9._-]*[a-zA-Z0-9_-])?$/;

['f', 'fo', 'foo', 'f.o'].forEach(
  (subject) => {
    console.log(`Match "${subject}": ${pattern.test(subject) ? '✅' : '❌'}`);
  }
);
['.', '.f', 'f.'].forEach(
  (subject) => {
    console.log(`No Match "${subject}": ${!pattern.test(subject) ? '✅' : '❌'}`);
  }
);
xu3bshqb

xu3bshqb3#

如果点只允许在中间,则可以将点夹在
[a-zA-Z0-9_-]的。
如果要允许点并排,请添加一个限定符:\.+

^[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)*$

https://regex101.com/r/BLTNib/1

^                             # BOL
 [a-zA-Z0-9_-]+                # Required class, one or more
 (?: \. [a-zA-Z0-9_-]+ )*      # Optional repeating dot followed by class
 $                             # EOL

相关问题