我正在学习正则表达式并找到了一些代码,因此我在终端中进行了测试,并在下面给出了结果
$ 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
为什么最后两个表达式给出相同的输出,所以我想知道怎么做?还有一件事情,第一个表达式输出在一行中,其余两个表达式输出在多行中,为什么呢?我是正则表达式的新手,它非常令人困惑
最后,我只想知道以上表达式或代码行的工作流程
答案 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
中最大的数字序列是3
或8
或0
,因为它们之间用.
隔开>
例如,如果您的版本为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