8

我有一个如下示例输入文件,其中包含 ID、名称、开始日期、结束日期、年龄、描述和位置列:

220;John;23/11/2008;22/12/2008;28;Working as a professor in University;Hyderabad
221;Paul;30;23/11/2008;22/12/2008;He is a software engineer at MNC;Bangalore
222;Emma;23/11/2008;22/12/200825;Working as a mechanical engineer;Chennai

它包含 30 行数据。我的要求是只从上述文本文件中提取描述。

我的输出应该包含

在大学担任教授

他是 MNC 的软件工程师

作为机械工程师工作

我需要找到一个正则表达式来提取描述,并且尝试了很多种,但我一直无法找到解决方案。我该怎么做?

4

4 回答 4

22

您可以使用此正则表达式:

[^;]+(?=;[^;]*$)

[^;]匹配任何字符,除了;

+是与前面的字符或组匹配一到多次的量词

*是与前面的字符或组匹配零到多次的量词

$是字符串的结尾

(?=pattern)是一个前瞻,它检查特定模式是否提前发生

于 2013-02-19T05:27:04.493 回答
5

/^(?:[^;]+;){3}([^;]+)/将抓住分号之间的第四组。

尽管如我的评论中所述,您应该只用分号拆分字符串并抓住拆分的第四个元素......这是分隔文件的全部要点 - 您不需要复杂的模式匹配。

使用您的输入示例在 Perl 中的示例实现:

open(my $IN, "<input.txt") or die $!;

while(<$IN>){
    (my $desc) = $_ =~ /^(?:[^;]+;){3}([^;]+)/;
    print "'$desc'\n";
}
close $IN;

产量:

'Working as a professor in University'
'He is a software engineer at MNC'
'Working as a mechanical engineer'
于 2013-02-19T05:13:33.070 回答
0

这应该有效:

/^[^\s]+\s+[^\s]+\s+[^\s]+\s+(.+)\s+[^\s]+$/m

或者正如孤独的牧羊人指出的那样

/^\S+\s+\S+\s+\S+\s+(.+)\s+\S+$/m

或者用分号:

/^[^;]+;[^;]+;+[^;]+;+(.+);+[^;]+$/m
于 2013-02-19T05:01:51.143 回答
0

看起来比较简单:

https://regex101.com/r/W9nfsd/2

.*;(.*);.*$

它类似于Anirudha 的答案,但更简单一些。

于 2019-01-04T04:30:04.313 回答