分页: 1 / 1
[讨论]匹配整数的正则表达式,再次请教!!
发表于 : 2007-05-22 20:31
由 ichthyornis
^[1-9][0-9]*$
这个表达式可以匹配放在单行里的正整数(无符号),也无空格制表符等,如果要匹配在行中间的无符号整数(如果以空格分制表符分隔)
[\t ]+[1-9][0-9]*[\t ]+
但是要匹配行首(前无空格制表符)或则行末(后无字符)的整数时,这个表达是式不能用了。如果要匹配任意的整数,包括在行首尾和在中间的情况,正则表达式应该怎么写?
希望高手给点建议
发表于 : 2007-05-22 20:33
由 BigSnake.NET
\b[1-9][0-9]*\b
发表于 : 2007-05-22 21:08
由 ichthyornis
测试成功,非常感谢
发表于 : 2007-05-22 22:23
由 ichthyornis

还是有问题!
代码: 全选
#CHGCAR文件
CaCO3-aragonite
1.000000000000000
4.961400 0.000000 0.000000
0.000000 7.967100 0.000000
0.000000 0.000000 5.740400
12
Direct
0.250000 0.085105 0.259481
0.250000 0.414895 0.759481
0.750000 0.585105 0.240519
0.750000 0.914895 0.740519
0.250000 0.738619 0.415570
0.250000 0.761381 0.915570
0.750000 0.238619 0.084430
0.750000 0.261381 0.584430
0.024132 0.678919 0.912519
0.024132 0.821081 0.412519
0.975868 0.178919 0.587481
0.975868 0.321081 0.087481
64 108 80
0.26580719412E+02 0.17179387286E+02 0.18993911278E+02 0.22074623538E+02 0.26491702725E+02
0.32330871821E+02 0.39694522346E+02 0.48695884661E+02 0.59428145137E+02 0.71892352244E+02
0.85886926744E+02 0.10089039604E+03 0.11599475036E+03 0.12994660847E+03 0.14131862254E+03
0.14877818477E+03 0.15137842723E+03 0.14877818477E+03 0.14131862254E+03 0.12994660847E+03
0.11599475036E+03 0.10089039604E+03 0.85886926744E+02 0.71892352244E+02 0.59428145137E+02
0.48695884661E+02 0.39694522346E+02 0.32330871821E+02 0.26491702725E+02 0.22074623538E+02
... ...
代码: 全选
[zhoub@nsi diff]$ head -200 CHGCAR | sed -n '/\b[1-9][0-9]*\b/'p
1.000000000000000
4.961400 0.000000 0.000000
0.000000 7.967100 0.000000
0.000000 0.000000 5.740400
12
0.250000 0.085105 0.259481
0.250000 0.414895 0.759481
0.750000 0.585105 0.240519
0.750000 0.914895 0.740519
0.250000 0.738619 0.415570
0.250000 0.761381 0.915570
0.750000 0.238619 0.084430
0.750000 0.261381 0.584430
0.024132 0.678919 0.912519
0.024132 0.821081 0.412519
0.975868 0.178919 0.587481
0.975868 0.321081 0.087481
64 108 80
代码: 全选
[zhoub@nsi diff]$ head -200 CHGCAR | sed -n '/\b[1-9][0-9]\b/'p
12
64 108 80
我的目的就是找出这两行,但是上面的 /\b[1-9][0-9]*\b/ 为什么会错而 /\b[1-9][0-9]\b/ 却得到正确的结果?
后面的式子只能匹配2位数的行,我把64和80改成164和180后,后一个表达式就找不到这行了?
那位给解释一下吧

发表于 : 2007-05-22 22:28
由 BigSnake.NET
发现是因为小数点不认为是非\w
发表于 : 2007-05-22 22:32
由 ichthyornis
代码: 全选
[zhoub@nsi diff]$ head -200 CHGCAR | sed -n '/\s[1-9][0-9]*\s/'p
64 108 80
匹配不了12的那一行
谢谢你了
发表于 : 2007-05-22 22:50
由 BigSnake.NET
sed -n '/\(^\|\s\)[1-9][0-9]*\($\|\s\)/p'
如果你认为整数两边必须是空白的话
发表于 : 2007-05-22 22:51
由 ichthyornis
小数点也是\b匹配的字符,看来还要另外想办法了
代码: 全选
[zhoub@nsi diff]$ echo "wode.xex" |sed -n '/de\b/'p
wode.xex
不知道 /(^| ) *[1-9][0-9]* */ 为什么不行
发表于 : 2007-05-22 22:59
由 BigSnake.NET
grep -E '(^|\s)[1-9][0-9]*($|\s)'
sed -n -r '/(^|\s)[1-9][0-9]*($|\s)/p'
发表于 : 2007-05-22 23:02
由 ichthyornis
BigSnake.NET 写了:sed -n '/\(^\|\s\)[1-9][0-9]*\($\|\s\)/p'
如果你认为整数两边必须是空白的话
这个好像行了,非常感谢你,我学到了不少