给定字符串 str,我们的任务是利用正则表达式来检查该字符串是否为有效的域名。一个有效的域名必须满足以下条件:
- 域名只能包含 a-z、A-Z、0-9 以及连字符 (-)。
- 域名部分的长度必须在 1 到 63 个字符之间。
- 域名部分不能以连字符 (-) 开头或结尾(例如 -example.org 或 example.org- 是无效的)。
- 最后一个顶级域名(TLD)的长度必须至少为 2 个字符,且最多为 6 个字符。
- 域名可以包含子域名(例如 write.example.org)。
示例:
> 输入: str = "write.example.org"
> 输出: true
> 解释:
> 给定的字符串满足上述所有条件。因此,它是一个有效的域名。
>
> 输入: str = "-example.org"
> 输出: false
> 解释:
> 给定的字符串以连字符 (-) 开头。因此,它不是一个有效的域名。
>
> 输入: str = "example.o"
> 输出: false
> 解释:
> 给定字符串的最后一个 TLD 只有 1 个字符,而最后一个 TLD 的长度必须在 2 到 6 个字符之间。因此,它不是一个有效的域名。
>
> 输入: str = ".org"
> 输出: false
> 解释:
> 给定的字符串不是以 a-z、A-Z 或 0-9 开头。因此,它不是一个有效的域名。
方法: 我们的想法是利用正则表达式来解决这个问题。我们可以按照以下步骤来计算答案:
- 获取字符串。
- 创建一个正则表达式来检查有效的域名,如下所示:
> regex = "^((?!-)[A-Za-z0-9-]{1, 63}(?<!-)\\.)+[A-Za-z]{2, 6}$"
- 其中:
- ^ 代表字符串的开始。
- ( 代表组的开始。
- (?!-) 代表字符串不应以连字符 (-) 开头(负向零宽断言)。
- [A-Za-z0-9-]{1, 63} 代表域名部分应包含 a-z 或 A-Z 或 0-9 以及连字符 (-),且长度在 1 到 63 个字符之间。
- (?<!-) 代表字符串不应以连字符 (-) 结尾(反向负向零宽断言)。
- \. 代表字符串后面跟着一个点。
- )+ 代表组的结束,该组必须至少出现一次,但允许出现多次以支持子域名。
- [A-Za-z]{2, 6} 代表 TLD 必须是 A-Z 或 a-z,长度在 2 到 6 个字符之间。
- $ 代表字符串的结束。
- 将给定的字符串与正则表达式进行匹配。在 Java 中,我们可以使用 Pattern.matcher() 来实现。
- 如果字符串与给定的正则表达式匹配,则返回 true,否则返回 false。
下面是上述方法的实现:
C++
#include
#include
using namespace std;
// Function to validate the domain name
bool isValidDomain(const string &str)
{
// Regex to check valid Domain Name
regex pattern("^[A-Za-z0-9-]{1,63}\\.[A-Za-z]{2,6}$");
// Return true if the string matches the regex
return regex_match(str, pattern);
}
// Driver Code
int main()
{
// Test Case 1:
string str1 = "example.org";
cout << (isValidDomain(str1) ? "true" : "false") << endl;
// Test Case 2:
string str2 = "contribute.example.org";
cout << (isValidDomain(str2) ? "true" : "false") << endl;
// Test Case 3:
string str3 = "-example.org";
cout << (isValidDomain(str3) ? "true" : "false") << endl;
// Test Case 4:
string str4 = "example.o";
cout << (isValidDomain(str4) ? "true" : "false") << endl;
// Test Case 5:
string str5 = ".org";
cout << (isValidDomain(str5) ? "true" : "false") << endl;
return 0;
}
Java
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DomainValidator {
// Function to validate the domain name
public static boolean isValidDomain(String str)
{
// Regex to check valid Domain Name
String regex
= "^[A-Za-z0-9-]{1,63}\\.[A-Za-z]{2,6}$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
// Return true if the string matches the regex
return matcher.matches();
}
public static void main(String[] args)
{
// Test Case 1:
String str1 = "example.org";
System.out.println(
isValidDomain(str1)); // Expected output: true
// Test Case 2:
String str2 = "contribute.example.org";
System.out.println(
isValidDomain(str2)); // Expected output: true
// Test Case 3:
String str3 = "-example.org";
System.out.println(
isValidDomain(str3)); // Expected output: false
// Test Case 4:
String str4 = "example.o";
System.out.println(
isValidDomain(str4)); // Expected output: false
// Test Case 5:
String str5 = ".org";
System.out.println(
isValidDomain(str5)); // Expected output: false
}
}