-1

我有一些文本文件,其中包含大量信息。它们中的大多数句子都以某个信息列表开头。现在我可以使用其他正则表达式代码(日期、网址、电子邮件等)提取一些项目,所以我正在使用它们。但对于其他信息,我不知道从哪里开始......

例如 :

ITEM_LIST_1 = xxxx .
ITEM_LIST_2 = xxxx .
ITEM_LIST_3 = xxxx .
....

我正在寻找一个正则表达式,它将提取特定项目的 xxxx(句子)。

谢谢大家

4

1 回答 1

3
(?<=ITEM_LIST_\d+ = ).*(?= \.)

应该与xxxx上面示例中的相匹配。不过,它需要一个允许任意长度环视的正则表达式引擎。大多数人不会(.NET 会)。

另一种选择是

ITEM_LIST_\d+\s*=\s*(.*)\s*\.

并使用匹配号 1。这不需要环顾四周,但匹配比您需要的更多,并使用捕获组来选择总匹配的子字符串。

如果我们知道您的情况,两者都可以通过更好的性能和更少的匹配错误的机会来针对您的问题进行微调xxxx

编辑:如果这些项目都在一行中,那么上面的正则表达式会失败(因为它很贪婪):

PS> [regex]::matches('Item_List_01 = Chapter1 overview, Who''s who, Chapter2 How to. Item_List_02 = Continue of Chapter2, Problems.', 'Item_List_\d+\s*=\s*(.*)\.') | select groups

Groups
------
{Item_List_01 = Chapter1 overview, Who's who, Chapter2 How to. Item_List_02 = Continue of Chapter2, Problems., Chapt...

您可以通过使其变得懒惰来修复它:

Item_List_\d+\s*=\s*(.*?)\.

这确实有效,然后:

PS> [regex]::matches('Item_List_01 = Chapter1 overview, Who''s who, Chapter2 How to. Item_List_02 = Continue of Chapter2, Problems.', 'Item_List_\d+\s*=\s*(.*?)\.') | select groups

Groups
------
{Item_List_01 = Chapter1 overview, Who's who, Chapter2 How to., Chapter1 overview, Who's who, Chapter2 How to}
{Item_List_02 = Continue of Chapter2, Problems., Continue of Chapter2, Problems}

但是,如果项目中有句号,它将再次失败:

PS> [regex]::matches('Item_List_01 = Foo. Bar. Item_List_02 = Baz, gak.', 'Item_List_\d+\s*=\s*(.*?)\.') | select groups

Groups
------
{Item_List_01 = Foo., Foo}
{Item_List_02 = Baz, gak., Baz, gak}

这可以通过添加一个前瞻(再次)来解决,它确保行/字符串的结尾或另一个项目如下:

Item_List_\d+ = (.*?)\.(?=$| Item_List_\d)

(关于空间,\s*等:我在整个解决方案中多次更改空间处理时有点草率。您应该知道您期望什么数据并相应地调整正则表达式。您还改变了ITEM_LIST/ Item_Listin你的问题和评论。你也应该保持一致。)

于 2012-04-04T05:53:06.490 回答