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

标签 regex perl

我正在使用 Perl 从文本文件中提取某些行。这些行都以十一个字符代码开头,例如

 XXX   YXXXZZXX  Data to get

其中 X 始终是数字,Y 可以是字母数字或缺失,Z 可以是字母数字(具体可以是 A 或数字 0-9。另一个问题是,如果 Z 部分是 3 个字符而不是 2 个字符,则有时此字符代码可以是 12 个字符长.

 XXX   YXXXZZZXX  Data to get

我可以在前三个 XY 中进行硬编码,但我需要代码对于 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),我需要使代码足够灵活,以便为所有内容执行 if 语句2 位和 3 位数字代码以及潜在的 AA id。

我已经尝试过

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

但我认为它工作得不太正常。我认为 . 可能太灵活了。关于执行此操作的正确方法有什么建议吗?谢谢!

最佳答案

General Pattern : XXX YXXXZZXX Data to get

where X is always a digit, Y can be alphanumeric or missing, Z can be alphanumeric (specifically it can be A or a digit 0-9. The other wrinkle is that sometimes this character code can be 12 characters long if the Z part is three characters instead of 2.

尝试翻译您的规范,我想出了这个:

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

演示:

http://regexr.com?38ejs


更新:

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

http://rubular.com/r/6asYzHqi5P

072 C001AA00 Data to get 1

072 C0010300 Data to get 2

072 C00110200 Data to get 3

关于regex - 匹配正则表达式中可变长度的数字或字母数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22216237/

相关文章:

php - 如何从 Perl 调用 PHP 脚本?

php - 在 SQL 查询中匹配绑定(bind)参数

php - 正则表达式 php 前瞻号码

不包含第一个字符的正则表达式模式

perl - 如何在 Cygwin 上为 Perl 设置 'use diagnostics'?

perl - 如何在 Perl 中构建和解析 HTTP URL/URI/路径?

perl - 移位和取消引用运算符的问题

Javascript正则表达式从字符串的开头删除除数字以外的任何内容

python - 将词边界语法添加到字符串列表

bash - 在后缀文件中查找和替换 URL - Linux/Ubuntu