【问题标题】:How to exclude specific text in perl regexp match如何在 perl 正则表达式匹配中排除特定文本
【发布时间】:2013-10-11 04:31:36
【问题描述】:

我正在使用 perl 来解析一个大的报告文件。我通过在报告某些行的开头查找姓氏和名字来提取姓名。我正在尝试排除名称后面的文本。其中一些文本字段是数字,因此很容易——我只是寻找非数字字符。但有些是我可以列出的固定文本字段。

例如---

LastNameA, FirstNameA
LastNameB, FirstNameB 345C
LastNameC, FirstNameC BADTEXT
LastNameD, FirstNameD MOREBADTEXT

我已经尝试了以下

/^(\D*)((BADTEXT|MOREBADTEXT|))/
/^(\D*)(BADTEXT|MOREBADTEXT|)/
/^(\D*?)((BADTEXT|MOREBADTEXT|))/
/^(\D*)((BADTEXT|MOREBADTEXT)?)/
/^(\D*)(?:(BADTEXT|MOREBADTEXT|))/

和其他几种组合。但是我要么不匹配,要么匹配 BADTEXT 或 MOREBADTEXT 被吸入 1 美元而不是 2 美元。我要么想要 $2 中的错误文本,要么根本不匹配。

请注意,我不想附加到名称的文本将是一个非常小的已知文本字符串列表之一,因此我可以将它们添加到条件组中。

我已通读 perlretut 两次,但找不到如何执行此操作。看起来应该很简单!非常感谢任何帮助。

【问题讨论】:

  • 忽略正则表达式中不需要的额外文本:/(\w+), (\w+)/?
  • 感谢您的评论,但这不起作用,因为名称字段有时有中间首字母、JR、SR 等。

标签: regex perl


【解决方案1】:

如何在空白处拆分文本并仅保留您喜欢的部分?

#!/usr/bin/perl

use strict;
use warnings;

while (my $line=<DATA>) {
    my @name=grep { ! /\d|^BADTEXT$|^MOREBADTEXT$/ } split /\s+/, $line;
    print "@name\n";
}

__DATA__
LastNameA, FirstNameA
LastNameB, FirstNameB 345C
LastNameC, FirstNameC BADTEXT
LastNameD, FirstNameD MOREBADTEXT

结果:

LastNameA, FirstNameA
LastNameB, FirstNameB
LastNameC, FirstNameC
LastNameD, FirstNameD

这当然意味着您需要知道名称中没有数字(没有 Wainright 3、Loudon),并且您可以创建一个详尽的列表,列出您想要排除的文本,并且这些文本永远不等于名字。

如果你知道只有一个姓氏和一个名字,你可以抓住 split() 返回的前两个元素。

【讨论】:

  • 那行得通。我一直在顽固地寻找一种将所有内容嵌入到一个正则表达式中的解决方案。但有时最好保持简单并继续前进!谢谢。
  • 希望正则表达式做所有事情是很常见的。有时这只会让事情变得更复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2012-02-02
  • 2022-12-11
  • 2010-12-20
相关资源
最近更新 更多