我正在尝试以 xlsx 形式为survey123 编写正则表达式代码,以一次仅匹配以下场景之一。该字段可以具有以下之一:
[1-9]{1,3} or
[0-9]{1,3}/[0-9]{1,3} or
[0-9]{1,3}/[0-9]{1,3};[0-9]{1,3}/[0-9]{1,3}
第二部分(;[0-9]{1,3}/[0-9]{1,3})
重复了未指定的次数。
但是我希望在它们所处的场景中使用/
和;
required ,而在它们不存在的场景中则不允许。我的代码不起作用。有人可以帮我解决这个问题吗?
我已经尝试([0-9]{1,3}\/[0-9]{1,3}\;[0-9]{1,3}\/[0-9]{1,3})|([0-9]{1,3})|([0-9]{1,3}\/[0-9]{1,3})
过在线测试器https://regexr.com/?32jph但我无法匹配2/3
或0/2
不应该有任何前导零。
我在数鸟。如果鸟类是一种难以区分性别的鸟类,我只计算鸟类的总数(1-999)。如果可以确定物种性别,那么我记录雄性/雌性的数量(0/1 或 2/3)。当我有不止一组可以确定性别的相同物种时,我会记录雄性/雌性;雄性/雌性;雄性/雌性(0/2;2/3;4/0;1/1)最多为该物种的组数。当我将这些输入到survey123 中时,我希望正则表达式需要正确的格式。
可接受的条目示例如下:
1
99
887
104
180
0/99
300/0
2/3
65/3
1/2;2/0
1/2;2/0;9/50;3/2;0/1
第一步是让正则表达式识别不带前导零的整数 0..999;“单数”示例可能需要 1..999 变体。
没有前导零意味着:
[1-9][0-9]{0,2}
这不包括 0(所以它涵盖了 1..999)。添加 0 本身需要与此等效的东西(有替代方法可以实现相同的结果):
(0|[1-9][0-9]{0,2})
现在您需要将其构建为识别单个数字;一对用斜杠分隔的数字 0..999 将是:
(0|[1-9][0-9]{0,2})/(0|[1-9][0-9]{0,2})
由分号分隔的此类数字对的列表将是:
(0|[1-9][0-9]{0,2})/(0|[1-9][0-9]{0,2})(;(0|[1-9][0-9]{0,2})/(0|[1-9][0-9]{0,2}))*
因此,整个正则表达式需要是:
(0|[1-9][0-9]{0,2})|(0|[1-9][0-9]{0,2})/(0|[1-9][0-9]{0,2})(;(0|[1-9][0-9]{0,2})/(0|[1-9][0-9]{0,2}))*
您可以根据需要添加锚点(例如^
和$
)。/
如果您的宿主语言坚持/
使用正则表达式,您可能需要转义。
转换为 Perl 并带有锚点,在行首和行尾留出空间,但中间不允许留出空间,产生:
#!/usr/bin/env perl
use strict;
use warnings;
my $qr = qr%
^ \s* (
(0|[1-9][0-9]{0,2}) |
(0|[1-9][0-9]{0,2})/(0|[1-9][0-9]{0,2}) (;(0|[1-9][0-9]{0,2})/(0|[1-9][0-9]{0,2}))*
) \s* $
%x;
while (<>)
{
chomp;
if ($_ =~ m/$qr/)
{
print "Matches: $_\n";
}
else
{
print "Failed: $_\n";
}
}
这相当冗长,但还算清楚。该qr% … %x
符号编译了一个分布在多行中的正则表达式,其中正则表达式中的空格并不重要。有很多捕获括号可能应该是非捕获的,但这是 Perl 正则表达式的一个特性,在其他地方不一定可用。
鉴于样本数据:
1
99
887
2/3
65/3
1/2;2/0
1/2;2/0;9/50;3/2;0/1
2x/3
elephant
0
0/0
1/2;3/4;7/8;15/16;31/32;63/64;127/128;255/256;511/512
1000
1234/234
234/1234
输出是:
Matches: 1
Matches: 99
Matches: 887
Matches: 2/3
Matches: 65/3
Matches: 1/2;2/0
Matches: 1/2;2/0;9/50;3/2;0/1
Failed: 2x/3
Failed: elephant
Matches: 0
Matches: 0/0
Matches: 1/2;3/4;7/8;15/16;31/32;63/64;127/128;255/256;511/512
Failed: 1000
Failed: 1234/234
Failed: 234/1234
失败符合我的预期。唯一有争议的行是0
and 可能0/0
(你只显示尾随0
,而不是前导0
)。调整很容易。
Perl的将允许我使用\d
到位的[0-9]
; 由于您没有说明您使用的是什么,因此不清楚这是否适合您。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句