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