正则表达式 - 以。开头的句子

时间:2012-04-04 05:49:44

标签: regex

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

例如:

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

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

全部

1 个答案:

答案 0 :(得分: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_List的大小写。您也应该保持一致。)