javascript - 正则表达式匹配由点分隔的字符串,只能包含字母数字、连字符、下划线、点

标签 javascript regex string

我需要一个与以下内容匹配的正则表达式:

a.b.c

a0.b_.c

a.bca._cda.dca-fb

请注意,它可以包含数字,但组之间用点分隔。允许的字符为 a-zA-z、-、_、0-9

规则是不能以数字开头,也不能以点结尾。即,正则表达式应该匹配

0a.b.c

a.b.c.d.

我想出了一个正则表达式,它似乎适用于 regex101,但不适用于 javascript

([a-zA-Z]+.?)((\w+).)*(\w+)

enter image description here `

但在js中似乎不起作用:

var str = "a.b.c"

if (str.match("([a-zA-Z]+.?)((\w+).)*(\w+)")) {
  console.log("match");
} else {
  console.log("not match");
}

// says not match

最佳答案

如果您使用 anchor 断言该行的开头 ^ 和结尾 $,则您的正则表达式与您的值匹配。

作为替代方案,您可以使用:

^[a-z][\w-]*(?:\.[\w-]+)*$

这将断言行 ^ 的开头,匹配单词字符 \w (将匹配 [a-zA-Z0- 9_]) 或字符类 [\w-] 中的连字符。

然后重复匹配点的模式和字符类中允许的字符 (?:\.[\w-]+)* 直到行尾 $

const strings = [
  "a.b.c",
  "A.b.c",
  "a0.b_.c",
  "a.bca._cda.dca-fb",
  "0a.b.c",
  "a.b.c.d."
];
let pattern = /^[a-z][\w-]*(?:\.[\w-]+)*$/i;

strings.forEach((s) => {
  console.log(s + " ==> " + pattern.test(s));
});

如果匹配不应该以数字开头,但可以以下划线或连字符开头,您可以使用:

^[a-z_-][\w-]*(?:\.[\w-]+)*$

关于javascript - 正则表达式匹配由点分隔的字符串,只能包含字母数字、连字符、下划线、点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51104269/

相关文章:

javascript - Ember - 如何将选定的选项值作为参数传递给操作处理程序

r - 零宽度负先行断言如何在 R 中工作?

string - 将 PowerShell 对象转换为字符串

java - CompareTo 预期元素错误

javascript - 在带有 Ajax 的 javascript 中使用 'this'

javascript - 是否可以在 javascript 执行中写入 mongodb 控制台?

javascript - VVO Lazyload 在页面加载时加载所有图像

java - 如何使用java将jmeter jtl httpSample/httpSample子子值替换为父值

javascript - 组合两个正则表达式模式 : case insensitivity and escape backslash

ios - 无法使用类型为 'String' 的参数列表调用类型为 '(CustomObject)' 的初始值设定项