Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在bash中使用正则表达式运算符=~匹配重复字符?_Regex_Bash - Fatal编程技术网

Regex 如何在bash中使用正则表达式运算符=~匹配重复字符?

Regex 如何在bash中使用正则表达式运算符=~匹配重复字符?,regex,bash,Regex,Bash,我想知道字符串是否使用=~运算符重复字母6次或更多 a="aaaaaaazxc2" if [[ $a =~ ([a-z])\1{5,} ]]; then echo "repeated characters" fi 上面的代码不起作用。BASH regex-flavor,即ERE不支持regex中的反向引用 作为替代解决方案,您可以使用grep中的扩展正则表达式选项执行此操作: a="aaaaaaazxc2" grep -qE '([a-zA-Z])\1{5}' <<<

我想知道字符串是否使用=~运算符重复字母6次或更多

a="aaaaaaazxc2"
if [[ $a =~ ([a-z])\1{5,} ]];
then
     echo "repeated characters"
fi

上面的代码不起作用。

BASH regex-flavor,即ERE不支持regex中的反向引用

作为替代解决方案,您可以使用
grep
中的扩展正则表达式选项执行此操作:

a="aaaaaaazxc2"
grep -qE '([a-zA-Z])\1{5}' <<< "$a" && echo "repeated characters"

repeated characters

[[$var=~$regex]]
以POSIX ERE语法解析正则表达式

见,重点补充:

BACKREF
-仅适用于基本正则表达式。由一个字符后跟一个数字“1”到“9”组成的字符串


POSIX标准没有正式规定ERE的反向参考;因此,它们不能保证在bash的原生正则表达式语法中可用(取决于特定于平台的libc扩展),因此必须使用外部工具(awk、grep等)。

对于这种特定的单字符重复情况,您不需要完全的反向引用。您可以只构建正则表达式来检查每个小写字母的重复

regex="a{6}"
for x in {b..z} ; do regex="$regex|$x{6}" ; done    
if [[ "$a" =~ ($regex) ]] ; then echo "repeated characters" ; fi
使用上述for循环构建的正则表达式如下所示

> echo "$regex" | fold -w60
a{6}|b{6}|c{6}|d{6}|e{6}|f{6}|g{6}|h{6}|i{6}|j{6}|k{6}|l{6}|
m{6}|n{6}|o{6}|p{6}|q{6}|r{6}|s{6}|t{6}|u{6}|v{6}|w{6}|x{6}|
y{6}|z{6}
此正则表达式的行为与您预期的一样

> if [[ "abcdefghijkl" =~ ($regex) ]] ; then \
  echo "repeated characters" ; else echo "no repeat detected" ; fi
no repeat detected
> if [[ "aabbbbbbbbbcc" =~ ($regex) ]] ; then \
  echo "repeated characters" ; else echo "no repeat detected" ; fi
repeated characters

在@sln的评论之后更新了,将绑定的
{6,}
表达式替换为一个简单的
{6}

那么您希望
\1
作为反向引用吗?这是一个PCRE扩展,在POSIX ERE中不可用。是的,如果我使用
egrep'([a-z])\1{5,}文件
,它可以工作。请参阅,或者对于正式规范。您想要的功能根本不可用。我发现Ubuntu支持反向引用。相反,在Ubuntu的libc上。这意味着您甚至不依赖于bash的特定构建(在使用相同选项编译相同版本的任何地方工作),而是依赖于它所运行的平台。你不需要更多的部分,只需要一个
{6}
,因为匹配6个以上并不能提供信息。
> if [[ "abcdefghijkl" =~ ($regex) ]] ; then \
  echo "repeated characters" ; else echo "no repeat detected" ; fi
no repeat detected
> if [[ "aabbbbbbbbbcc" =~ ($regex) ]] ; then \
  echo "repeated characters" ; else echo "no repeat detected" ; fi
repeated characters