[0-9] *和[0-9]

时间:2018-07-07 06:54:14

标签: regex

我正在学习正则表达式并找到了一些代码,因此我在终端中进行了测试,并在下面给出了结果

$ echo "my version 3.8.0" | grep -o '[0-9.]*'
3.8.0
$ echo "my version 3.8.0" | grep -o '[0-9]*'
3
8
0
$ echo "my version 3.8.0" | grep -o '[0-9]'
3
8
0

为什么最后两个表达式给出相同的输出,所以我想知道怎么做?还有一件事情,第一个表达式输出在一行中,其余两个表达式输出在多行中,为什么呢?我是正则表达式的新手,它非常令人困惑

最后,我只想知道以上表达式或代码行的工作流程

4 个答案:

答案 0 :(得分:1)

[0-9.]*

匹配来自集合0123456789.的零个或多个字符。因此,它可以匹配整个字符串3.8.0

[0-9]*

匹配零个或多个数字。因此,它可以匹配每个数字,但必须省略点。你得到三场比赛;每行显示一个。

[0-9]

精确匹配一位数字。由于3.8.0仅包含一位数字,因此最后两个正则表达式的输出是相同的。情况会随着3.8.10之类的输入而改变。

答案 1 :(得分:1)

首先,请注意:

[0-9] matches exactly one digit
[0-9]* matches a sequence of digits of any length

在您的情况下,3.8.0中最大的数字序列是380,因为它们之间用.隔开

例如,如果您的版本为38.1.0,那么您会看到不同之处:

[0-9] would give 3, 8, 1, 0
[0-9]* would give 38, 1, 0

答案 2 :(得分:1)

在任意范围(或字符)末尾的*使其对与该范围(字符)匹配的所有出现次数进行零次或多次计数。

例如,[0-9]*上的38.65.32会给您

38
65
32

但是,[0-9]会给你

3
8
6
5
3
2

答案 3 :(得分:1)

[0-9.]*会给您3.8.0,因为您使用的character class会匹配数字或点零或多次匹配所有字符。

[0-9]*将使用quantifier与数字匹配零次或多次。由于示例数据包含由点分隔的单个数字,因此,由于该点将不匹配,因此最多只能匹配一个数字。

[0-9]将匹配一位数字而没有一个量词。

例如,如果您的字符串是"my version 3.80.0"

[0-9.]*将匹配3.80.0

[0-9]*将匹配3 80 0

[0-9]将匹配3 8 0 0