正则表达式......尽可能少

时间:2016-08-22 10:26:11

标签: regex regex-negation regex-lookarounds regex-greedy

我有这个人名及其历史生日的文字:

  

Прп。 МоисеяМурина(ок.400)。 Обретениемощейпрп。 ИоваПочаевского(1659)。 СоборпреподобныхотцовКиево-Печерских,вДальнихпещерах(прп.Феодосия)почивающих。 Прп。 СаввыКрыпецкого,Псковского(1495)。 Прав。 Анныпророчицы,дщериФануилевой,встретившейГосподаИисусаХриставхрамеИерусалимском(I)。 Мц。 Шушаники,кн。 Ранской(V)(Груз。)。 Сщмч。 АлексияБудрина(1918); прмчч。 Казанских:СергияЗайцева,ЛаврентияНикитина,СерафимаКузьмина,ФеодосияАлександрова,ЛеонтияКарягина,Стефана,ГеоргияТимофеева,ИларионаПравдина,ИоаннаСретенскогоиСергияГалина(1918)。 Прп。 ИсаакияОптинского(1894)。 Сщмч。 АлександраМедведевадиакона(1918); сщмч。 НиколаяГеоргиевскогопресвитера(1931); сщмч。 ВасилияСокольскогопресвитера(1937)。 ГрузинскойиконыБожиейМатери(1650)。

任务是仅对那些生日1900年以上的人进行正则表达。 在这个例子中,正则表达式应该标记:

  

Сщмч。 АлексияБудрина(1918); прмчч。 Казанских:СергияЗайцева,ЛаврентияНикитина,СерафимаКузьмина,ФеодосияАлександрова,ЛеонтияКарягина,Стефана,ГеоргияТимофеева,ИларионаПравдина,ИоаннаСретенскогоиСергияГалина(1918)。 Сщмч。 АлександраМедведевадиакона(1918); сщмч。 НиколаяГеоргиевскогопресвитера(1931); сщмч。 ВасилияСокольскогопресвитера(1937)。

我试过这个正则表达式:

(?<=\)\.)(.)+?\((19|20)\d{2}\)\.

以positiv lookbehind(?&lt; =)查找')。'但不知怎的,它超越了第一场比赛并试图获得尽可能多的比赛.. 像:

  

Обретениемощейпрп。 ИоваПочаевского(1659)。 СоборпреподобныхотцовКиево-Печерских,вДальнихпещерах(прп.Феодосия)почивающих。 Прп。 СаввыКрыпецкого,Псковского(1495)。 Прав。 Анныпророчицы,дщериФануилевой,встретившейГосподаИисусаХриставхрамеИерусалимском(I)。 Мц。 Шушаники,кн。 Ранской(V)(Груз。)。 Сщмч。 АлексияБудрина(1918); прмчч。 Казанских:СергияЗайцева,ЛаврентияНикитина,СерафимаКузьмина,ФеодосияАлександрова,ЛеонтияКарягина,Стефана,ГеоргияТимофеева,ИларионаПравдина,ИоаннаСретенскогоиСергияГалина(1918)。 Прп。 ИсаакияОптинского(1894)。 Сщмч。 АлександраМедведевадиакона(1918); сщмч。 НиколаяГеоргиевскогопресвитера(1931); сщмч。 ВасилияСокольскогопресвитера(1937)。

部分如......

  

Обретениемощейпрп。 ИоваПочаевского(1659)。 СоборпреподобныхотцовКиево-Печерских,вДальнихпещерах(прп.Феодосия)почивающих。 Прп。 СаввыКрыпецкого,Псковского(1495)。 Прав。 Анныпророчицы,дщериФануилевой,встретившейГосподаИисусаХриставхрамеИерусалимском(I)。 Мц。 Шушаники,кн。 Ранской(V)(Груз。)。

...或

  

Прп。 ИсаакияОптинского(1894)。

什么是正确的表达才能正确匹配?

例如

:它应匹配

)。的 SOMETHING (19 \ d \ d)。

2 个答案:

答案 0 :(得分:0)

不幸的是,不是俄罗斯的说话者,但是这个会让你开始吗?

[\p{L},\h]+
\(1[0-8]\d{2}\)

a demo on regex101.com。要展开名称部分,请在课程中包含其他字符(例如.

<小时/> 正如其他人所提到的,它可能更容易抓住所有日期,然后以编程方式对它们进行分析。

答案 1 :(得分:0)

这似乎有效:

(?<=\)[.;])\s*([^()]+\((?:19|20)\d\d\))

DEMO

非贪婪量词仅影响比赛结束的位置,而不影响比赛的开始位置。您需要找到可以排除的内容,以防止它过早启动。在这种情况下,排除括号([^()]+)似乎有效,但我无法保证它始终如此。名称如:

Bill S. Preston (Esq.) (1970)

......会使任务变得更加困难。