我正在尝试用Perl读取regex格式。有时,我看到的格式不是一行,而是三行。
对于下面的单行格式,我可以regex作为
/^s*(.*)s+([a-zA-Z0-9._]+)s+(d+)s+(.*)/
获取行中的前3个单独项目
Hi There FirstName.LastName 10 3/23/2011 2:46 PM
下面是我看到的多行格式。我正在尝试使用类似的东西
/^s*(.*)n*n*|s+([a-zA-Z0-9._]+)s+(d+)s+(.*)$/m
获取单个项目,但似乎不起作用。
Hi There
FirstName-LastName 8 7/17/2015 1:15 PM
Testing - 12323232323 Hello There
有什么建议吗?多行正则表达式可能吗?
注:在相同的输出中,我可以看到单线或多线,或者两者都有,所以输出可以像下面一样
你好,Line1 FirstName.LastName 10 2011年3月23日下午2:46
Hello Line2
Line2FirstName-LastName 8 7/17/2015 1:15 PM
Testing - 12323232323 Hello There
你好,第3行第3行名字。姓氏8 2011年3月21日下午2:46
您肯定可以在多行中应用正则表达式。
我在单词之间使用了否定的单词W+
来匹配单词之间的空格和换行符(实际上W
等于[^a-zA-Z0-9_]
(。聊天被视为一个重复的w+W+
块。
如果你提供更具体的输入/输出情况,我可以完善示例代码:
#!/usr/bin/env perl
my $input = <<'__END__';
Hi There
FirstName-LastName 8 7/17/2015 1:15 PM
Testing - 12323232323 Hello There
__END__
my ($chat,$username,$chars,$timestamp) = $input =~ m/(?im)^s*((?:w+W+)+)(w+[-,.]w+)W+(d+)W+([0-1]?d/[0-3]?d/[1-2]d{3}s+[0-2]?d:[0-5]?ds?[ap]m)/;
$chat =~ s/s+$//; #remove trailing spaces
print "chat -> ${chat}n";
print "username -> ${username}n";
print "chars -> ${chars}n";
print "timestamp -> ${timestamp}n";
Legenda
m/^.../
从行首开始匹配正则表达式(非替代类型((?im)
:不区分大小写的搜索和多行(^/$match start/end of line(s*
匹配零个或多个空白字符(匹配空格、制表符、换行符或表单提要(((?:w+W+)+)
(匹配组$chat(匹配一个或多个由单个单词w+
(字母、数字、'_'(和非单词W+
(非w
的所有内容,包括换行符n
(组成的模式。稍后对其进行过滤以删除尾随空白(w+[-,.]w+)
:(匹配组$username(这是我们的弱点。如果用户名不是由两个用短划线'-'
或逗号','
(UPDATE(或句点'.'
分隔的正则表达式组成的,则整个正则表达式无法正常工作(我已经从您的问题中提取了这两种可能性,但没有直接指定((d+)
:(匹配组$chars(由一个或多个数字组成的数字([0-1]?d/[0-3]?d/[1-2]d{3}s+[0-2]?d:[0-5]?ds[ap]m)
:(匹配组$timestamp(这比其他组的拆分时间长:[0-1]?d/[0-3]?d/[1-2]d{3}
匹配由月(带可选前导零(、日(带可选前缀零(和年组成的日期,从1000到2999(放宽限制:([0-2]?d:[0-5]?ds?[ap]m
匹配时间:小时:分钟,可选空格和"pm,pm,am,am,am,pm…"感谢上面不区分大小写的修饰符
你可以在这里在线测试
您的正则表达式显示:
^s*(.*)n*n* # line starts with optional space followed by anything
| # or
s+([a-zA-Z0-9._]+)s+(d+)s+(.*)$ # spaces followed by any words followed by spaces, digits, spaces, anything at the end of the line
考虑一下:
/^From|To$/
交替和序列一样紧密。上面实际上是说要找到一条以"Fro"开头、后跟"m"或"T"、后跟"o"、后跟行末尾的行
与此相比:
/^(From|To)$/
上面将找到只有"From"或"To"的行