我有一些文本文件,其中包含大量信息。其中的大多数句子都以某个信息列表开头。现在我可以用其他正则表达式代码提取一些项目(日期,网址,电子邮件等等),所以我正在使用它们。但对于其他信息,我不知道从哪里开始......。
例如:
ITEM_LIST_1 = xxxx .
ITEM_LIST_2 = xxxx .
ITEM_LIST_3 = xxxx .
....
我正在寻找创建一个正则表达式,它将提取特定项目的xxxx(句子)。
全部
答案 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
的大小写。您也应该保持一致。)