Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在正则表达式中匹配可变长度的数字或字母数字_Regex_Perl - Fatal编程技术网

Regex 在正则表达式中匹配可变长度的数字或字母数字

Regex 在正则表达式中匹配可变长度的数字或字母数字,regex,perl,Regex,Perl,我正在使用Perl从文本文件中提取某些行。所有行都以和11个字符的代码开头,如 XXX YXXXZZXX Data to get 如果X始终是一个数字,Y可以是字母数字或缺失,Z可以是字母数字(具体来说,它可以是a或数字0-9。另一个问题是,如果Z部分是三个字符而不是两个字符,那么这个字符代码有时可能有12个字符长 XXX YXXXZZZXX Data to get 我可以在前三个X和Y中硬编码,但我需要为Z灵活编码。我基本上需要将Z存储为ID变量。对于上下文,前三个字母表示

我正在使用Perl从文本文件中提取某些行。所有行都以和11个字符的代码开头,如

 XXX   YXXXZZXX  Data to get
如果
X
始终是一个数字,
Y
可以是字母数字或缺失,
Z
可以是字母数字(具体来说,它可以是
a
或数字
0-9
。另一个问题是,如果
Z
部分是三个字符而不是两个字符,那么这个字符代码有时可能有12个字符长

 XXX   YXXXZZZXX  Data to get
我可以在前三个
X
Y
中硬编码,但我需要为
Z
灵活编码。我基本上需要将
Z
存储为ID变量。对于上下文,前三个字母表示调查中的问题编号,即“要获取的数据”是的答案。所以假设我在寻找问题
72
,那么(假设Q72没有缺少
Y
),我使用的匹配代码是

 if(m{^072(\s+)YXXX(d\{2,3})(\d{2})(\s+)(.+)}){
      my $id = $2;
      my $Data = $5
 }
这似乎解决了11对12个字符的问题,因为11个字符代码中的最后一个
XX
总是只有两个字符长。如果代码是12个字符长,唯一增加的部分是
Z
部分。因此,这应该能够捕获所有2位和3位id(如果我错了,请纠正我)

问题是,有时id将是
AA
(从不
AAA
),我需要使代码足够灵活,以便对所有2位和3位代码以及潜在的
AA
id执行if语句

我试过了

 if(m{^072(\s+)YXXX(.{2,3})(\d{2})(\s+)(.+)}){
      my $id = $2;
      my $Data = $5
 }

但是我认为它不太合适。我认为
可能太灵活了。关于正确的方法有什么建议吗?谢谢!

也许以下内容会有所帮助:

use strict;
use warnings;

while (<DATA>) {
    my ( $id, $data ) = /^072\s+\w{4}(\w{2,3})\w{2}\s+(.+)/;
    print "ID: $id; Data: $data\n";
}

__DATA__
072 C001AA00 Data1 to get
072 C0010300 Data2 to get
072 C00110200 Data3 to get
一般模式:XXX YXXZZXX要获取的数据

其中X始终是一个数字,Y可以是字母数字或缺失,Z可以是 字母数字(具体来说,它可以是A或数字0-9。另一个 皱纹是,有时这个字符代码可以是12个字符 如果Z部分是三个字符而不是2个字符,则为long

为了翻译您的规范,我提出了以下建议:

[\d]{3}\s*[\d\w]?[\d]{3}[A\d]{2,3}[\d]{2}\s*(.+)
演示:


更新:

还有另一个演示(包含所有测试用例和匹配组):

072 C001AA00数据获取1

072 C0010300数据获取2

072 C00110200数据获取3


你能举例说明你想匹配和提取什么吗?
072 C001AA00数据以获取
072 C0010300数据以获取
072 C00110200数据以获取
。第一个ID是
AA
第二个ID是
03
,第三个ID是
102
。谢谢。最后两个是
XX
总是两位数长?如果是这样,你可以离开
{2,3}
,在最后一个XX使用
\d{2}
。这将修复“过于灵活”的部分。另外请注意,如果你不需要它们,你不需要在
\s+
\d+
周围使用paren。你应该能够使用
\072\s+YXXX(.{2,3}\d++)
然后获取
我的$id=$1;我的$Data=$2
。你好@Jerry。是的
XX
总是两位数长。我在上面输入代码时犯了一个错误。我已经更改了帖子以反映这一点。谢谢!但是,我必须为许多不同的问题这样做,而且这部分代码已经嵌套得很深了,所以我被删除了希望有一种方法可以在一行中完成这一切,只需更改匹配的命令。有没有比使用
(.{2,3})更好的方法来查找
AA
0-9
?@MarkClements-看我修改过的答案。哦,我没有意识到
\w
既能捕获字母数字又能捕获数字。我以为它只能捕获字母数字字符。我有什么误解吗?@MarkClements-
\w
(用于word)匹配字母数字字符和下划线“\ux”.@MarkClements字母数字是一个用于字母和数字的术语。字母表示字母,数字表示数字。
[\d]{3}\s*[\d\w]?[\d]{3}[A\d]{2,3}[\d]{2}\s*(.+)