URL 正则表达式匹配小数点后精确 3 个字符

3
我需要一个正则表达式来匹配小数点后面恰好有3或2个字符,以便验证www.xyz.com而不是xyz.Complete。

我使用了这个表达式"[a-zA-Z0-9-.]+.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU)"来匹配,但它也匹配了"xyz.Complete"和"xyz.Completion"这样的文本,这不应该是这样的。 - daisy
那么.co.uk地址呢,或者.info,或者.museum呢?列表可以继续下去... - joe92
虽然我在下面的回答中尝试提供了我认为您需要的信息,但您似乎正在尝试做的事情最终会失败或让您感到头痛 - 真实生活中的URL比您的表达式要复杂得多... - Code Jockey
3个回答

2

我认为你需要的是 \b

我想不出一个情况,它不能通过使用单词边界断言\b来合理覆盖。其他答案只需要在结尾加上\b(如果它总是.com,那么你会使用.com\b,这基本上意味着一个字面上的点(.)字符后跟com,其后跟的内容不是字母、数字或下划线。它是一种零宽度断言,这意味着它不会捕获任何内容。要允许.net.edu,您将使用\.(com|edu|net)\b

\b断言在大多数使用正则表达式的工具和语言中都得到支持,但如果您需要更精确的控制(例如,您可能希望在com之后允许下划线),您的工具或语言编译器可能支持“前瞻”,它们也是零宽度断言。(在上面提到的例子中,您将使用类似于\.(com|net|edu|org|mil|museum)(?![a-zA-Z0-9])这样的东西,它将禁止数字和大写或小写字母)


1
你忘记了字符串的开头和结尾检查(^$)。使用以下代码:
^[a-zA-Z0-9\-\.]+\.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU)$

这里假设 xyz.com/index.html 是无效的。其他通过的内容包括:..com-.comten.-.-.-.-.-.-.net - Brigand
我最初使用了它,但不知道为什么,它仍然无法验证“www.google.com”或“在@ google.com引用我的网站”。 - daisy
@user1158326 您想要验证什么?只是域名吗?还是任何网址?或者是在某个随机字符串中的域名? - Dmytro Shevchenko
我想验证描述字段中的域名,现在我的描述是多行和动态的,它可以在中间某个位置包含网站URL,形式为www.xyz.com或http://www.xyz.com或http://xyz.com或类似于“contact us @ xyz.com”的文本(扩展名可能不同),如果http://没有被替换,那么没有问题,但URL必须被替换。 - daisy

1

严格回答您的问题:

精确匹配小数点后面的3或2个字符

仅匹配结尾:

\.[A-Za-z]{2,3}$

\ 转义了 .,否则它会表示“任何字符”


1
附注:它将接受任何顶级域名,而不仅限于问题中指定的那些。我不知道意图是什么,但这是需要记在心里的事情。 - Jaapjan
你能帮我修改这个表达式“[a-zA-Z0-9-.]+.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU)”,只匹配小数点后面的2或3个字符吗? - daisy
用我给出的表达式替换整个 OR (\.(com|... ) 表达式。为了让我指定的表达式起作用,顶级域必须在字符串的末尾。 - beerbajay
我按照我们说的方式替换了(\。(com | ...)),但现在它会精确地替换小数点后面任何单词的3个字符,例如,如果单词是“...xyz.completion..”,那么它会显示“xyz.xxxpletion”,这不应该是这种情况。 - daisy
@user1158326 - 不确定您要替换什么,但如果您采用@beerbajay的子表达式,则现在应该是 ^[a-zA-Z0-9\-\.]+\.[A-Za-z]{2,3}$。它只会匹配结尾处有效的2个或3个字母。如果您想修复它,请使用 ^([a-zA-Z0-9\-\.]+\.)([A-Za-z]{4,})$ 检查$2中的错误,然后将匹配内容替换为您想要的任何内容,例如 $1com - user557597

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接