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

13

我有一个样本输入文件,如下所示,包括Id、Name、起始日期、结束日期、年龄、描述和位置列:

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
为什么需要正则表达式?只需按分号拆分并获取第四列即可完成任务。此外,您应该标记所使用的编程语言。 - Lone Shepherd
我的要求是使用正则表达式...... - mahodaya
你是指你的作业任务吗? - Lone Shepherd
aql annotated query language - mahodaya
1
数据很混乱。John有两个日期,然后是一个数字(年龄);Paul有一个数字和两个日期;Emma有一个日期和一个与数字挤在一起的日期。所列出的列没有包括任何一个日期列。(有人拼错了“engineer”或“Bangalore”)。正则表达式如何知道将“Working”转换为“working”?那非常琐碎! - Jonathan Leffler
显示剩余4条评论
4个回答

24

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

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

[^;] 匹配除了 ; 以外的任何字符

+ 是一个量词,匹配前面的字符或分组一次或多次

* 是一个量词,匹配前面的字符或分组零次或多次

$ 表示字符串结尾

(?=pattern) 是一个先行断言,检查特定的模式是否在其前面出现


([^;]+(?=;[^;]*(\r?\n|$))) - AMit SiNgh

5

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

虽然如我评论中所述,你应该通过分号拆分字符串并获取分割的第四个元素...这就是定界文件的全部意义 - 你不需要复杂的模式匹配。

以下是使用您提供的示例在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'

我只能在我的编程中使用正则表达式//,不能使用以上的代码。 - mahodaya
我提供的是一个正则表达式。既然你没有指明使用的语言,我提供了一个利用该正则表达式的示例实现。 - Lone Shepherd
我正在使用AQL语言进行BigInsight文本分析。 - mahodaya

0

0

这应该可以工作:

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

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

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

或者使用分号:

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

1
\S 等同于 [^\s] - Lone Shepherd
现在我看到你又回到了分号的写法。/^[^;]+;[^;]+;+[^;]+;+(.+);+[^;]+$/m - Eric
我正在使用注释查询语言从文本文件中提取数据...这是IBM BigInsight文本分析的一种语言。 - mahodaya
根据我正在阅读的语言文档,它应该可以工作。当然,那是没有加入日期的情况下。只要在您想要的文本后面只有1列,这个正则表达式应该可以工作:/^.*;([^;]+);+[^;]+$/m(您不需要 m)。 - Eric
"/^.*;([^;]+);+[^;]+$/" 也没有提取我的输出,它在一行中提取了整个数据。 - mahodaya
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接