正则表达式检查字符串中的各种字符,后跟任意数字

regex check string for various characters followed by any number

提问人:kstats9pt3 提问时间:6/21/2023 最后编辑:Wiktor Stribiżewkstats9pt3 更新时间:6/21/2023 访问量:53

问:

我正在扫描只有管道、逗号和波浪号分隔符的文件的标题行,并确保列名不以数字开头。

为了便于测试,我使用以下变量,将正则表达式模式放入其自己的变量中,然后创建“好”和“坏”标头字符串:

# check if header row has columns that start with numbers
regex="[|~,][[:digit:]]" /* pipe, tilde, or comma followed by any digit */
good_header="col1|col2|col3"
bad_header="col1|2col|col3"

我希望返回以下内容,因为没有以数字开头的列名:good

if [[ $good_header =~ $regex ]]; then
    echo "good"
else
    echo "bad"
fi

但是,它返回 .为什么会这样?逻辑有什么问题?bad

bash if-语句

评论

2赞 Bohemian 6/21/2023
你的正则表达式不太正确;它不会找到.将其更改为"8col1|col2|col3""(^|[|~,])[[:digit:]]"
0赞 kstats9pt3 6/21/2023
谢谢,@Bohemian。你能简单解释一下你的逻辑正在做吗?另外,为什么当我替换为 ?[[:digit:]]\d
0赞 Bohemian 6/22/2023
更改为添加的输入锚点的开头作为备用前匹配 - 是正则表达式中的 OR 运算符(技术上称为交替)。许多语言/工具/shell 等,尤其是 bash,不理解速记之类的。 是 POSIX 标准。[|~,](^|[|~,])^|\d[[:digit:]]

答:

0赞 l'L'l 6/21/2023 #1

它返回为坏的原因是您的正则表达式没有找到任何与条件匹配的实例,因此它的计算结果为 false。将逻辑切换为:$good_header

if [[ $good_header =~ $regex ]]; then
    echo "bad"
else
    echo "good"
fi

评论

0赞 Grok42 6/21/2023
或者你的正则表达式。regex="[|~,][^[:digit:]]" /* pipe, tilde, or comma not followed by any digit */
1赞 kstats9pt3 6/21/2023
漫长的一天,感谢您的澄清!