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

Regex 在正则表达式中匹配表中的数字,regex,vim,windows-xp,Regex,Vim,Windows Xp,不要介意这种奇怪的编码方式 是否有一种方法(在这样的表格中,以破坏稳定性开始,以“洪水百分比”行结束),只匹配最后一列中小于某个值(例如,0.018)的数字 我正在练习正则表达式,但在现阶段这对我来说太多了。所以我希望至少有人能推荐最好的方法 SUMMARY OF RESULTS OF DAMAGE STABILITY ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

不要介意这种奇怪的编码方式

是否有一种方法(在这样的表格中,以破坏稳定性开始,以“洪水百分比”行结束),只匹配最后一列中小于某个值(例如,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.                              

您可以执行以下操作:

/0.0\(2[0-1]\|[0-1][0-9]\)$
$
是线锚的末端。分组的第一部分匹配20和21,因此0.021是将匹配的最大数字。
\\\\
之后的交替匹配从00到19的所有内容。所以这个正则表达式匹配行上的最后一个数字,它在0.021和0.000之间


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

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

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

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

示例
0.018
不太好,因为最后一列中的所有数字都大于
0.018
。。。。我花了几分钟才弄明白。我认为我的vim替换命令有问题

看看这个例子,给定的射程边界(以破坏稳定性开始,以“泛洪百分比”结束)是不必要的,但您最了解这个要求。我也在命令中添加了范围

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

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

/STABILITY/,/Flooding/s/\v([0-9.-]+)\s*$/\=str2float(submatch(1))我注意到您在Vim中这样做。简单地将特殊粘贴到Excel或类似文件中会更好吗?您希望如何处理这些匹配?替换为另一个值?你在使用linux box吗?@Kent-不,只需检查是否有小于某个有效值的值。匹配并突出显示感兴趣的值将帮助我浏览表格(每个文件中都有很多),因为现在我手动浏览数字。@BrianAgnew-想到了这一点,但由于输出是在txt文件中,并且有很多文件(一直在更改),这可能会减慢整个过程。我认为Vim现在是一个更好的选择。是的,在Excel中这会更简单。不幸的是,我们将文本文件作为输出处理,并将它们粘贴到Excel中会大大降低整个过程的速度。如果不是这样的话,我会同意——excel将是一个更好的解决方案。哎呀,对不起。看起来我粘贴了错误的表格作为示例。0.018是一个特征值,因此我们总是将其与该值进行比较。与其添加*,我如何匹配(突出显示)感兴趣的值?@ldigas它可以通过脚本完成,但不能通过一行命令完成。因为正则表达式不是进行数学计算(数字比较)的好工具。我不知道您要修改什么,但您可以在匹配的数字末尾添加一个标记,例如“###”,然后进行修改。完成后,移除这些标记。使用“####”还可以轻松搜索以“####”结尾的数字,然后使用
n
n
在这些匹配之间导航。就我的2美分。在同一个问题上,除了正则表达式,你认为什么是一个很好的工具,用于快速匹配与此类似的数据,但本质上很快?我所说的快速,是指不需要我为这样的操作编写40页的程序。这样的事情存在吗?我不知道高亮显示后你会怎么做。我想你想在匹配的行/数字上做些什么。如果我是你,我会照我在最后一句话里说的去做。将后缀(#####)添加到数字(by:s/./../),然后
/###$
我可以找到并突出显示所有数字,也可以
n
n
。最后删除###。似乎我重复了我最后的评论…:(我真的什么都不会做——这些文件只是我们需要对照某些要求检查的结果。问题是它们往往会变得很长,手动检查它们会让人疲惫不堪。因此我只想让Vim以更容易识别的方式显示它们。红色背景/白色字母中突出显示的数字比蓝色背景更容易识别。)那些有#或其他标记的。
 /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 '*'
 /STABILITY/,/Flooding/s/\v([0-9.-]+\d)\s*$/\=str2float(submatch(1))<0.040? submatch(1).'<':submatch(1)/
/[0-9.-]\+\d\ze<$