gpt4 book ai didi

regex - 如何确保 Bash 字符串是字母数字的,没有下划线?

转载 作者:行者123 更新时间:2023-11-29 08:55:56 29 4
gpt4 key购买 nike

我正在向现有脚本添加一项功能,允许用户配置 Linux 系统的主机名。我执行的规则如下:

  • 长度必须在 2 到 63 个字符之间
  • 不得以连字符开头或结尾
  • 只能包含字母数字字符和连字符;不允许使用所有其他字符(包括下划线,这意味着我不能使用\W 正则表达式符号)

我已经解决了列表中的前两个问题,但我无法弄清楚如何检查 bash 字符串是否只包含字母、数字和连字符。我想我可以用正则表达式来做到这一点,但我无法弄清楚如何(过去一个小时我一直在搜索网络和阅读手册页)。

我愿意使用 sed、grep 或任何其他标准工具,但不会使用 Perl 或 Python。

最佳答案

看起来应该这样做:

^[a-zA-Z0-9][-a-zA-Z0-9]{0,61}[a-zA-Z0-9]$

匹配任意一个字母数字字符,然后匹配最多 61 个字母数字字符(包括连字符),然后匹配任意一个字母数字字符。最小字符串长度为 2,最大为 63。它不适用于 Unicode。如果您需要它与 Unicode 一起使用,您需要添加不同的字符类来代替 a-zA-Z0-9,但原理是相同的。

我相信适用于 Unicode 的正确 grep 表达式是:

^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$

示例用法:


echo 123-abc-098-xyz | grep -E '^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$'

result=$(grep -E '^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$' <<< "this-will-work"); echo $result;

echo "***_this_will_not_match_***" | grep -E '^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$'

关于regex - 如何确保 Bash 字符串是字母数字的,没有下划线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1229210/

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