gpt4 book ai didi

regex - 对于带有连字符的域,正则表达式不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 04:58:05 26 4
gpt4 key购买 nike

我有一些智能脚本,可以检查服务器名称并获取域名。例如,我的服务器名称:example.ru01。我需要获取:example.ru 我的脚本:

#!/bin/bash

hostname=example.com01
echo $hostname
reg0="\(\(\w*\.[a-z]*\)\|\(\w*\.[a-z]*\.[a-z]*\)\)"
domain=`expr match $hostname $reg0`
echo $domain

没关系。在输出中我有:

example.com01
example.com

但是,在我的基础设施中,我有一些带有连字符的域。例如:test-test.com01。但它在我的脚本中不起作用。如何解决这个问题?请帮忙。我对正则表达式做了一些更改,如下所示:

\(\(\w*\.[a-z_-]*\)\|\(\w*\.[a-z_-]*\.[a-z_-]*\)\)

但是这不起作用。我哪里有错误?请帮忙。感谢您的关注。

最佳答案

是的,test-test.com01 将不匹配。

但是,www.test-test.com01 将:

$ hostname="www.test-test.com01"
$ reg0="\(\(\w*\.[a-z_-]*\)\|\(\w*\.[a-z_-]*\.[a-z_-]*\)\)"
$ expr match $hostname $reg0
www.test-test.com

问题是您需要一个可选的 w(零次或多次)和一个点 \.

嗯,事实上,你写的是“一个单词”\w,在这种情况下,如果你要匹配的是“www”,你应该删除反斜杠。

此外,域名中的下划线也是不正确的。这是您应该使用的正确正则表达式:

reg0="\(\(w\{1,3\}\.\)\?[a-z-]\+\(\.[a-z-]*\)\?\)"

在这个例子中,www. 是可选匹配的,然后是一个或(可选)两个名称,中间有一个点。

但是,域名可以包含数字:www.1and1.com

事实上,请注意!现在它们可以包含任何有效的 UTF-8 字符串:

摘自 RFC 6531 的第 3.3 节:

The definition of is extended to permit both the RFC5321 definition and a UTF-8 string in a DNS label that conformswith IDNA definitions [RFC5890].

以及 RFC 5890 的第 2.3.2.1 节

A "U-label" is an IDNA-valid string of Unicode characters, inNormalization Form C (NFC) and including at least one non-ASCIIcharacter, expressed in a standard Unicode Encoding Form (such asUTF-8).

关于regex - 对于带有连字符的域,正则表达式不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40951525/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com