javascript - 正则表达式以匹配逗号分隔的主机名

标签 javascript regex

问题

我正在尝试验证 <textarea> 的内容使用 JavaScript,所以我创建了一个 validate()函数,返回 truefalse文本区域内的文本是否有效。

文本区域只能包含逗号分隔的主机名。通过主机名,我的意思是像 subdomain.domain.com ,所以它基本上是一些点分隔的字符串。由于用户往往不会写得很好,我还希望允许在各种主机名和逗号之间保留任意数量的空格,但不要在主机名内

以下是一些应该匹配或不应该匹配的示例:

  • 应该匹配:

    • domain.com,domain2.co.vu,sub.domain.org
    • ​ domai2n.com , dom-ain.org.co.vu.nl ,domain.it ​
    • dom-ain.it, domain.com, domain.eu.org.something
    • a.b.c, a.b, a.a.a , a.r
    • 0191481.com
  • 不应该匹配:

    • domain.com., sub.domain.it不完整的主机名
    • domain.me, domain2不完整的主机名
    • sub.sub.sub.domain.tv, do main.it主机名包含空格
    • site不完整的主机名
    • hèy.com主机名不能包含重音符号
    • hey.01com主机名不能以数字或包含数字的字符串结尾
    • hello.org..wow不完整的主机名

到目前为止我尝试了什么

我使用以下代码构建了我的函数:

function validate(text) {
    return (
        (/^([a-z0-9\-\.]+ *, *)*[a-z0-9\-\.]+[^, ]$/i.test(text) 
        && !/\.[^a-z]|\.$/i.test(text)
        && ~text.indexOf('.'))
    );
}

不幸的是,我的功能不起作用。它无法识别不完整的主机名并返回 true .

有什么方法可以做到这一点吗?也许不使用 RegExp,即使我更愿意使用单个 RegExp。

最佳答案

说不使用正则表达式的答案非常好,但我喜欢正则表达式:

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

是的..它不是那么漂亮。但它有效 - 在 http://regex101.com 对您的示例案例进行了测试

编辑:好的,让我们分解一下。并且只允许 sub-domain-01.coma--b.com 而不是 -.com

每个子域 thingo: \w+(?:-+\w+)* 匹配单词字符的字符串加上可选的一些前面带有破折号的单词。

每个主机名:\s*(?:(?:\w+(?:-\w+)*\.)+[a-z]+)\s* 随后是一堆子域名一个点。最后后面只跟着一串字母(tld)。当然还有两侧的可选空间。

整个事情:\s*(?:(?:\w+(?:-\w+)*\.)+[a-z]+)\s*(?:,\s*(?: (?:\w+(?:-\w+)*\.)+[a-z]+)\s*)* 单个主机名,后跟 0 个或多个 ,hostname对于我们的逗号分隔列表。

真的很简单。

关于javascript - 正则表达式以匹配逗号分隔的主机名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28057243/

相关文章:

javascript - React - 未捕获的类型错误 : Cannot read property 'func' of undefined

javascript - 如何知道是否使用 jQuery 以百分比或像素设置 DIV 宽度

c - GNU regex.h 中 re_match 的意外结果,我错过了什么吗?

regex - MacOSX 10.9.5 上的 Sed 错误 "\1 not defined in the RE"

javascript - 如何使用 jQuery 解码 UTF8 字符?

javascript - 如何创建跟随鼠标移动 - javascript?

javascript - Aurelia 事件触发顺序

java - Java 是否有一种有效的方法在 StringBuilder 上执行多个正则表达式 ReplaceAll 操作?

php - preg_match 排除一个数字

python - 在正则表达式中组合括号和单词边界