首页 > 解决方案 > 如何修复匹配少数意外字符的正则表达式?

问题描述

我正在使用正则表达式,作为第一偏好,我打算匹配紧跟在字符串“Lecture”之后的字符(数字或字母数字),否则在没有字符串“Lecture”的情况下匹配行的最后一个字符。

当前的正则表达式

cat 1.txt | perl -ne 'print "$& \n" while /Lecture\h*\K\w+|^(?!.*Lecture).*\h\K[^.\s]+/g;/^.*?-(.*)/g' | perl -ne 'print "$& \n" while /(\d+\w*)/g'

要读取的数据不是很一致。字符串“Lecture”周围可能有空格或连字符,或者结束字符和行可能不会以 .mp4 结尾 我本可以只在此处包含这些行,但我不希望解决方案正则表达式因其他情况而中断。所以包括下面的所有可能性

猫 1.txt

54282068 Lecture74- AS 29 Question.mp4   
174424104Lecture 74B - AS 29 Theory.mp4   
Branch Accounts Lecture 105
Lecture05 - Practicals AS 28
Submissions 20.mp4
HW Section 77N
Residential status HWS Q.1 to 6 -60A
Residential status HWS Q.7 to 20 -60B
House property all HWS-60C
Salary HWS Q.11 to 13 - 60F
Salary HWS Q.1 to 5-60D
Salary HWS Q.6 to 10-60E
Salary HWS Q.14 to 20-60G
Operating Costing 351

预期产出

74
74B
105
05
20
77N
60A
60B
60C
60F
60D
60E
60G
351

确切问题- 对于最后一行上方的底部 3 行,它还打印 5,10 和 20 以及结束字符 60D、60E 和 60G

我相信我的正则表达式的最后一部分存在问题,需要一个非常小的编辑来修复。希望有人可以帮助我。

标签: regexperl

解决方案


请检查以下代码是否符合您的要求

use strict;
use warnings;
use feature 'say';

while( <DATA> ) {
    chomp;
    s/\.mp4//;
    say $1 if /Lecture\s*(\w+)/ or /(\d{2}[A-Z]?)\Z/;
}

__DATA__
54282068 Lecture74- AS 29 Question.mp4   
174424104Lecture 74B - AS 29 Theory.mp4   
Branch Accounts Lecture 105
Lecture05 - Practicals AS 28
Submissions 20.mp4
HW Section 77N
Residential status HWS Q.1 to 6 -60A
Residential status HWS Q.7 to 20 -60B
House property all HWS-60C
Salary HWS Q.11 to 13 - 60F
Salary HWS Q.1 to 5-60D
Salary HWS Q.6 to 10-60E
Salary HWS Q.14 to 20-60G

输出

74
74B
105
05
20
77N
60A
60B
60C
60F
60D
60E
60G

推荐阅读