【问题标题】:Regex to validate multiple domain names正则表达式验证多个域名
【发布时间】:2019-10-22 20:42:16
【问题描述】:

我正在尝试使用正则表达式(来自 Javascript)来验证域名列表。例如,如果用户输入:

facebook.com
*.com
apple.com

... 正则表达式应该验证正常。然而,

facebook.com
clearlynotadomainname
apple.com

...应该验证失败。

我正在使用这个正则表达式:

^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$

这适用于第一行文本,但一旦用户输入第一个 CR/LF,表达式就会失败。是否可以让正则表达式遍历或解析字符串中的所有行?

【问题讨论】:

  • 问题很不清楚..您的有效-无效示例不够充分nd r模棱两可
  • 在第一个示例中,所有三行都是有效的域名。在第二个示例中,第 1 行和第 3 行是有效域,而第 2 行不是域名。正则表达式捕获单行,但不捕获多行。这更清楚了吗?
  • 您是否尝试过使用修饰符 g 或 m? ^ 用于定义字符串的开头,$ 用于定义字符串的结尾...
  • Daan 下面的解决方案对我有用 - 无论如何感谢@ChaosClown!一定要爱那些在拼错“your”和“are”时抱怨清晰度的人......

标签: regex


【解决方案1】:

为什么不简单地在换行符上拆分字符串?假设您想忽略空行:

function testString(str) {
  var regex = /^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}(\n|$)/
  var split = str.split('\n')

  for(var i = 0; i < split.length; ++i) {
    if(split[i] != ''&& !regex.test(split[i]))
      return false
  }

  return true
}

testString('facebook.com\n*.com\napple.com')
=> true
testString('facebook.com\nclearlynotadomainname\napple.com')
=> false

【讨论】:

  • 完美 - 不好意思,我自己没想到 :) 谢谢!
【解决方案2】:

要验证 [,;] 域(仅),您可以使用:

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

在不同情况下进行测试。

【讨论】: