首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash子域regex验证永远不匹配

Bash子域regex验证永远不匹配
EN

Unix & Linux用户
提问于 2018-04-30 15:47:40
回答 1查看 1.2K关注 0票数 0

我试图验证用户输入的子域是否有效,但是不管我传入什么,它都是无效的。我知道regex是可以的,所以问题是我的"if“逻辑,但是我对shell/bash还不熟悉。

代码语言:javascript
复制
#!/bin/bash
#

echo Enter the subdomain\'s name to configure.
read SUBDOMAIN

if [[ ! $SUBDOMAIN =~ [A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])? ]]; then
    echo "$SUBDOMAIN is not a valid domain"
fi

示例:将被接受(常规子域名):测试不会被接受(无效子域名):-将不被接受(无效子域名):(空)不会被接受(无效子域名):#$??&@#&?$##$

我更喜欢使用shell,但是regex中的括号使脚本抛出一个错误。

我不确定是否可以用grep来完成它,但是我从来不知道如何使用grep,它总是让我感到困惑。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2018-04-30 16:16:21

如果您试图匹配“字母数字”和“字母数字或破折号”,确保末尾没有破折号,这样总共有1..62个字符,这个RE将适用于您。

代码语言:javascript
复制
^[[:alnum:]](([[:alnum:]]|-){0,61}[[:alnum:]])?$

这将绑定到字符串的开头和结尾,因此RE必须完全匹配字符串。

  • 行开始^
  • 一个字母数字,任何情况下[[:alnum:]]
  • 可选块(方括号内的(.),以?结尾)
    • [[:alnum:]]或短跑-,重复0..60次
    • [[:alnum:]]

  • 行尾$

正如在这个答案下的注释中所建议的那样,我应该指出,[[:alnum:]]范围受到当前区域设置的影响。如果要确保它只匹配"ASCII“and、and和0-9,则需要确保它与LANG=C一起运行。否则,您可能会发现更多的字符被接受,如áéfind和其他字符。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/440943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档