1

我想用正则表达式解析 MARC 记录,并将字段作为第一个捕获的组返回,将值作为第二个捕获的组返回。到目前为止,这是我对正则表达式的了解:

(\n[0-9]{3})[ 0-9]{4}([^\n]*)

那里的最后一个捕获组([^\n]*)捕获所有内容,直到下一个换行符,这对以下行非常有用:

001    868229892 
100 1  Montgomery, L. M.|q(Lucy Maud),|d1874-1942.,|eauthor. 
245 10 Anne of Green Gables /|cL.M. Montgomery. 
250    Aladdin hardcover edition. 
264  1 New York :|bAladdin,|c2014. 
300    440 pages &#59;|c22 cm 
336    text|2rdacontent. 
337    unmediated|2rdamedia. 
338    volume|2rdacarrier. 

但是,当涉及突破线的值时,正则表达式不再起作用:

520    Anne, an eleven-year-old orphan, is sent by mistake to 
       live with a lonely, middle-aged brother and sister on a 
       Prince Edward Island farm and proceeds to make an 
       indelible impression on everyone around her. 
650  0 Shirley, Anne (Fictitious character)|vJuvenile fiction. 

下一个停止区域应该是650上面的。因此,正则表达式应该捕获所有内容,直到换行符后跟 3 个数字

我确实尝试([^\n0-9]*)过,但这被解释为匹配除数字或任何顺序的换行符以外的任何内容。我需要它来匹配一个换行符和 3 个数字在那个确切的序列中

4

2 回答 2

1

这个正则表达式,如regex101 所示

(\n[0-9]{3})[ 0-9]{4}([^\n]+(?:\n\s+[^\n]+)*)

捕获组([^\n]+(?:\n\s+[^\n]+)*)匹配

  • 任何非换行符:[^\n]+
  • 然后是任意数量的额外行:(?:\n\s+[^\n]+)*
于 2016-07-29T19:18:53.323 回答
0

在末尾添加一个负前瞻,以确保换行符后跟 3 位数字。还可以做一些事情来缩短正则表达式。

(\n\d{3})[ \d]{4}((?:(?!\n\d{3}).)*)
于 2016-07-29T19:18:38.513 回答