使用正则表达式提取由分隔符分隔的文本的某些部分

时间:2013-02-19 04:53:17

标签: regex

我有一个示例输入文件,如下所示,列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 enginner;Chennai

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

我的输出应包含

  

在大学担任教授

     

他是MNC的软件工程师

     

作为机械工程师工作

我需要找到一个正则表达式来提取描述,并尝试了很多但却找不到解决方案。有什么建议吗?

4 个答案:

答案 0 :(得分:17)

您可以使用此正则表达式

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

[^;]匹配除;

之外的任何字符

+是一个量词,它匹配前面的char或group 1多次

*是一个量词,它匹配前面的char或0到很多次

$是字符串

的结尾

(?=pattern)是一个前瞻,用于检查特定模式是否在前方发生

答案 1 :(得分:4)

/^(?:[^;]+;){3}([^;]+)/将获得分号之间的第4组。

虽然如我的评论中所述,你应该用分号分割字符串并抓住分割的第4个元素...这是分隔文件的整个点,你不需要复杂的模式匹配。

使用输入示例在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 enginner at MNC'
'Working as a mechanical enginner'

答案 2 :(得分:0)

这应该有效

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

或孤独的牧羊人指出

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

或半冒号

/^[^;]+;[^;]+;+[^;]+;+(.+);+[^;]+$/m

答案 3 :(得分:0)

似乎相对简单:

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

.*;(.*);.*$

类似于Anirudha的回答,但简单一些。