【问题标题】:How does a validation regex look like which allows letters, numbers, dashes and dots only, forces at least one dot but not as first character?一个只允许字母、数字、破折号和点的验证正则表达式看起来如何,强制至少一个点而不是第一个字符?
【发布时间】:2025-12-08 04:50:01
【问题描述】:

我的正则表达式非常糟糕,但在我的 JavaScript 应用程序中,我试图验证一个表单项,表单项的值只能包含字母、数字、破折号和至少一个点。

所以以下是有效的:

hello.world

microsoft.com

到目前为止,我想出了这个(.+)[a-zA-Z0-9.-]\.[a-zA-Z0-9.-]+$,但它不起作用,因为我可以添加空格。我可以做些什么来使我的正则表达式工作?我也可以防止点成为第一个字符吗?

【问题讨论】:

  • ^[a-zA-Z0-9.-]*\.[a-zA-Z0-9.-]*$?

标签: javascript regex string validation


【解决方案1】:

我认为您可以通过以下方式实现这一目标

^[^.][a-zA-Z0-9.-]+$

^[^.] 没有起始点

[a-zA-Z0-9.-] 是所有字符小写、大写和数字,包括点和连字符。感谢 WiktorPeter 将我带到这里

$ 确保它是字符串的结尾,所以它不会匹配像“hello world”这样的部分

此处示例:https://regex101.com/r/BXHmwh/1

【讨论】:

  • 我将对答案进行编辑,我认为@WiktorStribiżew 您只需要编辑您的评论以容纳前导点,然后您就可以按照 OPs 的要求获得它。
  • @PeterSeliger 您可以自己更新答案或自己回答。虽然你说的问题我有点不清楚,OP没有说你指定的字符不能是起始字符。
  • @PeterSeliger 如上,随意编辑答案或发布答案,而不是将进一步的答案放入 cmets!
  • @NewToAngular ... 对于(我认为是)满足您所有所有要求的唯一解决方案是否有任何疑问?
【解决方案2】:

到目前为止接受的答案并不完全符合 OP 的要求,即 ...

表单项的值只能包含字母数字破折号至少一个点。 ...另外... 防止点成为第一个字符 ...

N.J.Dawson 的正则表达式 ...^[^.][a-zA-Z0-9.-]+$ ... 在最后一个要求中确实失败了,因为它允许作为第一个字符任何不是点的字符其中 OP 需要除点之外的任何上述引用字符。

例子:

const regX = (/^[^.][a-zA-Z0-9.-]+$/);

console.log(
  "regX.test('.foo-bar.baz-9') ?", // false as expected
  regX.test('.foo-bar.baz-9')      // because of dot first.
);
console.log(
  "regX.test('#foo-bar.baz-9') ?", // true which violates
  regX.test('#foo-bar.baz-9')      // the requirements
);                                 // due to using #.

可以通过将正则表达式更新为更具表现力的内容来完全满足要求...要测试的字符串,并且除了其他允许的字符外,还强制该字符串至少包含一个点。

更新示例:

const regX = (/^[a-zA-Z0-9-]+\.[a-zA-Z0-9.-]*$/);

console.log(
  "regX.test('.foo-bar.baz-9') ?", // false as expected
  regX.test('.foo-bar.baz-9')      // because of dot first.
);
console.log(
  "regX.test('#foo-bar.baz-9') ?", // false as expected
  regX.test('#foo-bar.baz-9')      // because of hash first.
);
console.log(
  "regX.test('+foo-bar.baz-9') ?", // false as expected
  regX.test('+foo-bar.baz-9')      // because of plus first.
);

console.log(
  "regX.test('-foo-bar.baz-9') ?", // true as expected.
  regX.test('-foo-bar.baz-9')
);
console.log(
  "regX.test('9.-foo-bar.baz') ?", // true as expected.
  regX.test('9.-foo-bar.baz')
);
console.log(
  "regX.test('9a-foo-bar-baz') ?", // false as expected.
  regX.test('9a-foo-bar-baz')      // bacause of missing dot.
);

【讨论】:

    最近更新 更多