匹配正则表达式中的表中的数字

时间:2013-05-15 08:26:36

标签: regex vim windows-xp

不要介意奇怪的编码。

有没有办法(在这样的表中,以OF DAMAGE STABILITY开头)并以“Flooding percentage”行结束,以匹配最后一列中小于某个值的数字(例如,0.018) ?

我正在练习正则表达式,但在现阶段这对我来说太过分了。所以我希望有人至少可以推荐一下最好的方法。

                    SUMMARY OF RESULTS OF DAMAGE STABILITY                      
 ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
       DAMAGE CASE               %  R  HEEL   GM     FBmin   GZ>0  GZmax  Area  
                                      (deg)   (m)     (m)   (deg)   (m)  (m.rad)
 ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
 109.10s                        100 1  -4.1   0.438   1.243  59.2  0.133  0.021 
                                 20 1  -6.6   0.740   2.215  63.4  0.479  0.049 
                                 40 1  -5.8   0.721   2.372  64.2  0.393  0.045 
                                 60 1  -3.2   0.728   2.537  66.8  0.277  0.041 
                                 80 1  -0.8   0.721   2.354  66.8  0.192  0.037 

 109.10p                        100 1  -4.1   0.438   1.243  59.2  0.133  0.021 
                                 20 1   4.5   0.688   2.494  65.5  0.507  0.049 
                                 40 1   3.7   0.684   2.580  66.3  0.417  0.046 
                                 60 1   1.1   0.720   2.599  68.9  0.300  0.043 
                                 80 1  -1.2   0.693   2.350  65.2  0.177  0.035 


 110.10s                        100 1  -3.0   0.748   1.837  39.7  0.494  0.049 
                                 20 1  -2.9   0.777   2.333  43.1  0.594  0.052 
                                 40 1  -2.9   0.777   2.333  42.5  0.576  0.052 
                                 60 1  -2.9   0.756   2.294  41.6  0.551  0.050 
                                 80 1  -2.9   0.748   2.077  40.7  0.520  0.049 

 110.10p                        100 1  -0.5   0.733   2.143  41.6  0.484  0.047 
                                 20 1  -0.5   0.763   2.627  45.3  0.613  0.051 
                                 40 1  -0.5   0.763   2.627  44.7  0.592  0.051 
                                 60 1  -0.5   0.740   2.593  43.8  0.558  0.049 
                                 80 1  -0.5   0.767   2.372  42.7  0.516  0.048 


 %     : Flooding percentage.                                                   
 R     : R=1 if run-off weights considered, R=0 if no run-off.                  
 HEEL  : Heel at equilibrium (negative if equilibrium is on port).              
 GM    : GM at equilibrium.                                                     
 FBmin : Minimum distance of margin line, weathertight or non-weathertight      
         points from waterline.                                                 
 GZ>0  : Range of positive GZ limited to immersion of non-weathertight openings.
 GZmax : Maximum GZ value.                              

3 个答案:

答案 0 :(得分:4)

0.018示例不好,因为您上一列中的所有数字都大于0.018 ....我花了几分钟才找到它。我以为我的vim替换命令有问题......

查看示例,给定的范围边界(以OF DAMAGE STABILITY开头并以“Flooding percentage”结尾)不是必需的,但您最了解要求。我也在命令中添加了范围。

在下面的命令中,我将其更改为0.040,以便我们可以看到差异。以下命令将在匹配的数字末尾添加*

 /STABILITY/,/Flooding/s/\v([0-9.-]+)\s*$/\=str2float(submatch(1))<0.040? submatch(1).'*':submatch(1)

简短说明:

 /STABILITY/,/Flooding/                                      " fit the range, as you defined
 s/                                                          " start substitution
 \v                                                          " use very magic, so that I could save some escaping
 ([0-9.-]+)\s*$/                                             " match the last number column (float or negative)
 \=str2float(submatch(1))<0.040? submatch(1).'*':submatch(1) " vimscript expression, if the value<0.040, add a '*'

如果你在Linux机器上,这个工作也很容易被awk完成。如果你是微软的人,Excel可能(我不确定)是一个好工具。

修改

从你的评论中,我认为你没有得到我的意思。我

命令:

 /STABILITY/,/Flooding/s/\v([0-9.-]+\d)\s*$/\=str2float(submatch(1))<0.040? submatch(1).'<':submatch(1)/

然后你搜索:

/[0-9.-]\+\d\ze<$

注意这突出了数字(我仍然使用0.040来查看差异),还添加了标记/后缀<。您可以按n移至下一个突出显示的数字。之前的N。如果您完成“阅读”文件,请退出:q!ZQ以跳过更改。

我希望这符合您的要求。

看到这个例子: enter image description here

答案 1 :(得分:2)

提出一个在浮点数上断言某个数字范围的正则表达式确实非常复杂。

如果您坚持使用Vim(请记住,它是文本编辑器,而过滤基于结构化列的信息更适合电子表格),您可以使用一个相当宽松的正则表达式,匹配所有数字“候选人”,并在替换表达式中执行确切的数字范围断言。您无法使用正常/搜索,您必须使用:substitute(例如,使用无操作替换或处理您想要实现的任何内容)来使用:help sub-replace-expression

:%substitute/[+-]\?\d\+\.\d\+$/\=str2float(submatch(0)) < 0.018 ? 'match' : submatch(0)/

答案 2 :(得分:0)

您可以执行以下操作:

/0.0\(2[0-1]\|[0-1][0-9]\)$

$是行锚的结束。分组的第一部分匹配20和21,因此0.021是匹配的最大数字。 \|之后的交替匹配从00到19的所有内容。因此,此正则表达式匹配行上的最后一个数字,该数字介于0.021和0.000之间。

正如您所看到的,比较数字对于正则表达式有点烦人,因为您需要将数字视为字符串,并使用ASCII顺序。