Robur_131 Asked: 2018-11-10 18:16:07 +0800 CST2018-11-10 18:16:07 +0800 CST 2018-11-10 18:16:07 +0800 CST 匹配字符串中的确切位数 772 给定一个字符串,我怎样才能知道它包含 7 个连续的数字? 如1505082或1505082_CSE_322但不是15050821或15050821_CSE_322 我试过了 grep -Eq [0-9]{7} <<< "1505082" 返回0但 grep -Eq [0-9]{7} <<< "15050821"` 也返回0。 我做错了什么? bash grep 3 个回答 Voted Best Answer user232326 2018-11-10T18:48:50+08:002018-11-10T18:48:50+08:00 是的,在(请引用正则表达式,否则它将被解释为 shell glob): grep -Eq '[0-9]{7}' <<< "1505082" grep 匹配 7 位数字。您可以通过将 q 替换为 来查看匹配的内容o: $ grep -Eo '[0-9]{7}' <<< "1505082"; echo "$?" 1505082 0 是的,它也会匹配这个: $ grep -Eq '[0-9]{7}' <<< "150508299999"; echo "$?" 1505082 0 它删除了所有的九点。 问题是您正在进行非锚定匹配,它将匹配 7 位(或更多)数字。 你可以锚定: $ grep -Eq '^[0-9]{7}$' <<< "15050829999"; echo "$?" 1 要在任何地方匹配 7 位数字并在非数字之后或之前匹配,您需要一个完全不同的锚点: $ grep -oP '(?<=^|[^0-9])[0-9]{7}(?=[^0-9]|$)' <<< "1505082"; echo $? 1505082 0 $ grep -oP '(?<=^|[^0-9])[0-9]{7}(?=[^0-9]|$)' <<< "1505082_CSE_322"; echo $? 1505082 0 $ grep -oP '(?<=^|[^0-9])[0-9]{7}(?=[^0-9]|$)' <<< "1505082999_CSE_322"; echo $? 0 那些是前瞻匹配,一个是回顾: (?<=^|[^0-9]) 匹配字符串 ( ^) 或非数字的开头。另一个是前瞻: (?=[^0-9]|$) 匹配非数字或字符串的结尾。 更简单的正则表达式的唯一另一种选择Extended是提取任何7(或更多)数字,然后确认它恰好是 7 位: $ echo "150508299_CSE_322" | grep -oE '[0-9]{7,}' | grep -qE '^[0-9]{7}$'; echo "$?" 1 ronnie bermejo 2018-11-11T06:47:21+08:002018-11-11T06:47:21+08:00 当事情变得复杂时grep,您总是可以使用egrep甚至是 linux/unix 系统中可用的编程语言来帮助您进行匹配/正则表达式。 如果您的系统有 perl 或 ruby,您可以在一行中完成: echo 1234567| ruby -lne 'print if /^\d{7}$/' echo 1234567| perl -lne 'print if /^\d{7}$/' 或者 cat file.txt | ruby -lne 'print if /^\d{7}$/' l3x 2020-04-23T06:53:36+08:002020-04-23T06:53:36+08:00 为什么不使用 Bash 的二元运算符=~? $ [[ 1505082 =~ [0-9]{7} ]] && echo matched matched 有关详细信息,请参阅:http ://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Conditional-Constructs
是的,在(请引用正则表达式,否则它将被解释为 shell glob):
grep 匹配 7 位数字。您可以通过将 q 替换为 来查看匹配的内容
o
:是的,它也会匹配这个:
它删除了所有的九点。
问题是您正在进行非锚定匹配,它将匹配 7 位(或更多)数字。
你可以锚定:
要在任何地方匹配 7 位数字并在非数字之后或之前匹配,您需要一个完全不同的锚点:
那些是前瞻匹配,一个是回顾:
匹配字符串 (
^
) 或非数字的开头。另一个是前瞻:匹配非数字或字符串的结尾。
更简单的正则表达式的唯一另一种选择
Extended
是提取任何7
(或更多)数字,然后确认它恰好是 7 位:当事情变得复杂时
grep
,您总是可以使用egrep
甚至是 linux/unix 系统中可用的编程语言来帮助您进行匹配/正则表达式。如果您的系统有 perl 或 ruby,您可以在一行中完成:
echo 1234567| ruby -lne 'print if /^\d{7}$/'
echo 1234567| perl -lne 'print if /^\d{7}$/'
或者
cat file.txt | ruby -lne 'print if /^\d{7}$/'
为什么不使用 Bash 的二元运算符
=~
?有关详细信息,请参阅:http ://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Conditional-Constructs