我想创建一个bash脚本,它应该决定给定的字符串,如果它们符合条件的话。
条款是:
我制作了这个剧本:
#!/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 "$@")
一切都很好,除了一件事: 无论多少个连字符彼此相邻,它都表示正确。 例如: 它对于这个字符串来说是真的&#34; le - le&#34;
我在网站(例如this)上尝试了这个正则表达式,并且它们没有出现这种故障。 我只能想到网页和linux bash之间必然存在差异。 (我只能在网页上看到它运行PHP)
你有什么想法,我怎么能让它发挥作用?
感谢您的回答!
答案 0 :(得分:0)
你的正则表达式至少存在一个问题:[^aeiou\W]
- 一个否定的“非单词”,意思是“单词” - 而matches any letter,包括辅音。角色类是包容性的,不是排他性的。我们最好只列出所有辅音(对于你的情况,我们也会在集合中添加'e'和' - ')。
请尝试this one :( 编辑:使用@ Laurel更简洁的char类)
`(?=^le-)(?!.*--)(?!.*-[^-]*e[^-]*e[^-]*-)[b-hj-np-tv-z-]*[^-]$`
(?=^le-)
以'le - '(?!.*--)
不允许双破折号(?!.*-[^-]*e[^-]*e[^-]*-)
在破折号之间看不到两个e [b-hj-np-tv-z-]*
- 消耗辅音,e和破折号(与[bcdfghjklmnpqrstlvwze-]
相同)[^-]$
最后一个字符必须是非破折号答案 1 :(得分:0)
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*)+$ ]]