gpt4 book ai didi

regex - Linux Bash 脚本正则表达式故障

转载 作者:太空宇宙 更新时间:2023-11-04 12:50:27 24 4
gpt4 key购买 nike

我想制作一个 bash 脚本,它应该决定给定的字符串是否满足条件。

条款是:

  • 字符串的前3个字符必须是"le-"
  • 连字符之间可以有任意数量的辅音,可以任意排列,只有一个“e”,不能包含任何元音。
  • 连字符之间必须有东西
  • 字符串不能以连字符结尾

我做了这个脚本:

#!/bin/bash
# Testing regex

while read -r line; do
if [[ $line =~ ^le((-[^aeiou\W]*e+[^aeiou\W]*)+)$ ]]
then
printf "\""$line"\"\t\t\t-> True\n";
else
printf "\""$line"\"\t\t\t-> False\n";
fi
done < <(cat "$@")

它做的一切都很好,除了一件事:无论有多少个连字符彼此相邻,它都表示为真。例如:它对这个字符串 "le--le"说是真的

我在网站上试过这个正则表达式(比如 this ),它们没有出现这种故障。我能想到的就是网页和 linux bash 之间一定有什么区别。 (我在网页上只能看到它运行PHP)

你有什么想法,我怎样才能让它发挥作用?

感谢您的回答!

最佳答案

sweaver2112正确地指出 \W 给你带来了问题,但没有提供一个 bash 测试正则表达式的工作示例来完成你的要求(至少,我无法让它工作)。

这似乎可以做到(改编 Laurel 的辅音正则表达式):

[[ "$line" =~ ^le(-[b-df-hj-np-tv-z]*e[b-df-hj-np-tv-z]*)+$ ]]

它匹配(例如):

le-e
le-e-le
le-e-e-e-e-e

更一般地说:

le-([[:consonant:]]*e[[:consonant:]]*)+

不匹配(例如):

le-
le--le
le-lea-le

另外,你可以这样写得更干净:

c='[b-df-hj-np-tv-z]'
[[ "$line" =~ ^le(-$c*e$c*)+$ ]]

关于regex - Linux Bash 脚本正则表达式故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37378246/

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