regex - 如何修复匹配少数意外字符的正则表达式?
问题描述
我正在使用正则表达式,作为第一偏好,我打算匹配紧跟在字符串“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
我相信我的正则表达式的最后一部分存在问题,需要一个非常小的编辑来修复。希望有人可以帮助我。
解决方案
请检查以下代码是否符合您的要求
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
推荐阅读
- css - 如何从任何页面 CSS Ionic 4 更改菜单背景
- flutter - 如何在颤动的列表中选择一个复选框
- java - 对象相等/哈希码与 JPA/Hibernate 实体相等/哈希码
- azure - 我应该在 Azure AD B2C 中同时注册前端应用和 api 应用吗?
- java - 序列化作为 Object 传递的可序列化对象
- azure - Calico GlobalNetworkPolicy 排除不起作用
- google-apps-script - 复制数据脚本不再起作用
- java - javax.crypto.BadPaddingException:解密错误 - 无法从文件中解密多个块
- tensorflow - 如何在 Tensorflow 2.0 (TFP) 中调试爆炸梯度(协方差矩阵)
- php - wordpress searchandfilter插件和php代码结果问题