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

时间:2018-06-29 14:44:15

标签: 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.

我想出了一个regex,它似乎可以在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

2 个答案:

答案 0 :(得分:1)

使用正斜杠/,并在使用JavaScipt时从在线正则表达式测试器中将正则表达式代码粘贴在它们之间

在这里,我对您的正则表达式模式所做的更改:

  • 在正则表达式的开头添加了^以匹配输入的开头
  • 在末尾添加了$以匹配输入的末尾
  • 删除了A-Z,并添加了i修饰符,以进行不区分大小写的搜索(这是可选的)。

另外,当您使用regex101时,请确保在创建/测试JavaScript正则表达式时选择JavaScript Flavor

var pattern = /^([a-z]+.?)((\w+).)*(\w+)$/i;

// list of strings, that should be matched
var shouldMatch = [
  'a.b.c',
  'a0.b_.c',
  'a.bca._cda.dca-fb'
];

// list of strings, that should not be matched
var shouldNotMatch = [
  '0a.b.c',
  'a.b.c.d.'
];

shouldMatch.forEach(function (string) {
  if (string.match(pattern)) {
    console.log('matched, as it should: "' + string + '"');    
  } else {
    console.log('should\'ve matched, but it didn\'t: "' + string + '"');
  }
});

shouldNotMatch.forEach(function (string) {
  if (!string.match(pattern)) {
    console.log('didn\'t match, as it should: "' + string + '"');
  } else {
    console.log('shouldn\'t have matched, but it did: "' + string + '"');
  }
});

More on regexes in JavaScript

答案 1 :(得分:0)

如果您使用锚点声明行的开始^和结束$,则您的正则表达式将与您的值匹配。

您也可以使用:

^[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-]+)*$