我想我对{3,5}
部分是如何工作的有错误的理解。
据我所知,它是指定一个范围,数字必须遵守返回一个搜索结果?
例如,3,5
意味着返回搜索的3到5位数字。经过一些实验,我意识到我的逻辑不完全正确。
它似乎适用于3-5个字符,然后是8,9和10个字符.
我是不是漏掉了一个图案?或者更简单的说,有人能给我解释一下背后的逻辑吗?它是3的倍数还是5的倍数?包括3-5的范围?在这里真的很困惑。谢谢!
user@matrix:~> echo 1234567891234 \ grep '0-9{3,5}‘ 1234567891234
以上匹配成功,包含12个字符.
发布于 2013-08-14 21:00:08
您可以使用-o
选项来可视化grep的工作方式:
echo 1234567891234 | grep -o '[0-9]\{3,5\}'
输出:
12345
67891
234
-o
将在每次匹配后添加一个新行到输出。如果没有该选项,grep将只打印匹配(Es)发生的整行--输入字符串本身将是什么。这样,您将无法看到grep如何准确地匹配字符串。
但是现在您可以看到grep在该行中找到了多个匹配项,其中2次是5位字符串,1次是3位字符串。
此外,除非您使用的是{}
选项,否则需要在-E
括号前面使用斜杠。
发布于 2013-08-14 21:05:36
您正确的假设是{3,5}定义了在它前面的类中选择的字符的重复--在3到5之间(都包括)重复。你也可以做一些类似{3,}
的事情,意思是“至少3次”。
使用-Ex
选项,E
-这样您就不必在括号和x
之前使用斜杠来处理整个行:
[alfasin@otrs ~]$ echo 1234567891234 | grep -Ex '[0-9]{3,5}'
[alfasin@otrs ~]$ echo 1234567891234 | grep -Ex '[0-9]{3,13}'
1234567891234
来自grep手册:
-E,- extended将模式解释为扩展正则表达式(ERE,见下文)。(-E由POSIX.) -x,- line -regexp只选择与整行完全匹配的匹配项。(-x由POSIX.)
发布于 2013-08-14 21:37:31
它和你写的一模一样:
grep '[0-9]\{3,5\}' - Is there 3 to 5 sequential numeric characters in this string?
如果字符串是1234567891234
,则其中有一个包含3-5个数字字符的子字符串.
如果您只对只包含3-5个数字字符且不超过5个字符的字符串感兴趣,则必须在正则表达式中设置一些边界。您还应该使用-E
标志,它使用更现代版本的正则表达式:
$ echo 12345678901234 | grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)"
这将不会打印任何内容,但这将:
$ echo 1234 | grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)"
这是:
$ echo 12345aaa6789aaa01234 | grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)"
第一个(^|[^0-9])
表示行的开头(这是最前面的^
),或者除字符0-9以外的任何内容。(这是[^0-9]
)。在扩展正则表达式中使用(...|...)
意味着左边的表达式或右边的表达式。这同样适用于结尾的([^0-9]|$)
,它要么表示非数字,要么表示行尾。
中间是[0-9]{3,5}
(扩展表达式不需要反斜杠)。这个数字在3到5位之间。而且,由于它被非数字绑定在两边,或者字符串的开始或结束,这将做你想做的事情。
几件事:
$ echo 12345aaa6789aaa01234 | grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)"
和
$ grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)" <<<"12345aaa6789aaa01234"
意味着几乎一样的事情。然而,第二个更有效,因为只有一个进程必须运行,而且没有管道。另外,打字的时间更短。
此外,您还可以使用字符类(并且它是首选的):
$ grep -E -E
这将允许您的正则表达式工作,即使您不在一个地方使用拉丁字母数字字符。这是一种更短的方法,因为\d
与[:digit:]
是同一个类。
$ grep -E "(^|[^\d])\d{3,5}([^\d]|$)"<<<"12345aaa6789aaa01234"
https://stackoverflow.com/questions/18242143
复制相似问题