Linux Bash脚本正则表达式失败

时间:2016-05-22 18:47:51

标签: regex linux bash

我想创建一个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 "$@")

一切都很好,除了一件事: 无论多少个连字符彼此相邻,它都表示正确。 例如: 它对于这个字符串来说是真的&#34; le - le&#34;

我在网站(例如this)上尝试了这个正则表达式,并且它们没有出现这种故障。 我只能想到网页和linux bash之间必然存在差异。 (我只能在网页上看到它运行PHP)

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

感谢您的回答!

2 个答案:

答案 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*)+$ ]]