Регулярное выражение для соответствия предложению, содержащему ключевое слово (также должно работать с сокращениями и числами) - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь сопоставить полное предложение, содержащее определенную строку (две вложенные группы захвата). Это также должно работать, если предложение включает аббревиатуры, такие как "e.g.|i.e.|R.S.V.P.|Mr.|Mrs.|approx.|…" или числа с точками 10.000, но в то же время должно быть защитным и не соответствовать коротким словам, за которыми следует точка, такая как Test. Метод определения границы предложения в основном находит символ ., который не является частью сокращенного или числового значения.

Открытые вопросы:

a) Как я могу ссылаться и повторять первая группа захвата перед запросом?

Допустимые комбинации символов повторяются до и после группы захвата (MYSEARCHQUERY). Производительность ухудшается, если список исключений для сокращений (Mr.|Mrs|…) большой - для Engli sh их число> 400.

export const englishAbbreviations = ['abbrev','absol','ad','aeronaut','af','agric','amer','anat','anthrop','anthropol','antiq','aphet','applic','appos','approx','arab','aram','assoc','astrol','astron','astronaut','attrib','austral','autobiogr','ave','bef','bibliogr','biochem','biol','bot','brit','bulg','bull','cal','canad','cat','catal','celt','cent','chem','chron','chronol','cinemat','cinematogr','clin','cogn','col','coll','collect','colloq','comb','comm','communic','comp','compan','compar','conc','conf','conj','cons','contrib','corr','corresp','crit','cytol','da','dat','deb','def','dem','dept','deriv','derog','devel','diagn','dial','dict','dim','dis','diss','du','ecol','econ','ed','edin','educ','ee','electron','elem','ellipt','embryol','engin','entomol','erron','ethnol','euphem','exam','exerc','exper','explor','fem','fig','finn','found','freq','fris','fund','gael','gaz','gen','geogr','geol','geom','geomorphol','ger','gloss','godef','goth','govt','gram','heb','hebr','her','herb','hind','hist','histol','hort','househ','housek','ibid','icel','ichthyol','id','ie','imit','immunol','impers','indef','inorg','introd','ir','irreg','it','jap','joc','jun','knowl','lang','lect','less','let','lett','lex','lit','lith','mag','magn','mal','man','managem','manuf','mar','masc','mataph','math','max','mdu','me','mech','med','mem','meteorol','mics','midl','mil','min','mineral','misc','mod','mus','mythol','narr','nat','naut','neurol','neut','no','nom','norw','nucl','numism','obstetr','occas','oe','of','ofris','oir','on','ophthalm','orig','ornith','os','outl','pa','palaeogr','palaeont','path','perh','pers','petrogr','petrol','pharm','philol','philos','phonet','photogr','physiol','pict','plur','poet','pol','polit','pop','porc','poss','pott','pple','pract','prec','pred','pref','prep','pres','princ','priv','prob','probl','proc','prof','pron','pronunc','prop','pros','prov','psychol','publ','quot','quots','radiol','rec','redupl','ref','refash','refl','reg','rel','reminisc','rep','repr','res','rev','rhet','rom','rum','russ','scand','sci','scot','scotl','sel','ser','sing','slav','soc','sociol','spec','stand','stanf','struct','stud','subj','subord','subseq','suff','superl','surg','taxon','technol','tel','telegr','teleph','theatr','theol','theoret','tokh','trans','trav','treas','treat','treatm','trig','trop','turk','typog','typogr','univ','usu','var','varr','vars','vertebr','vet','viz','voy','vulg','zoogeogr','zool'
];

b) Какой более умный способ определить предложение, содержащее строку поиска? Здесь есть лингвисты?

1 Ответ

0 голосов
/ 10 апреля 2020

Этот шаблон регулярного выражения соответствует строке (MYSEARCHQUERY) (группа захвата2) и предложению, в которую он встроен (группа захвата1).

/(
  (?:
    \b(?:[a-z]\.){2,}|
    \b(?:[a-z]*[bcdfghjklmnpqrstvwxysß]{3,}\.)|
    \b(?:[a-z][bcdfghjklmnpqrstvwxysß]{2,}\.)|
    \b(?:[bcdfghjklmnpqrstvwxysß]+\.)|
    \b(?:\d*\.\d+)|
    \b(?:[a-z]\.)|
    [^\.\?\!]|
    (?:(?:mr|mrs|approx|prof)\.)
  )*

  (MYSEARCHQUERY)

  (?:
    \b(?:[a-z]\.){2,}|
    \b(?:[a-z]*[bcdfghjklmnpqrstvwxysß]{3,}\.)|
    \b(?:[a-z][bcdfghjklmnpqrstvwxysß]{2,}\.)|
    \b(?:[bcdfghjklmnpqrstvwxysß]+\.)|
    \b(?:\d*\.\d+)|
    \b(?:[a-z]\.)|
    [^\.\?\!]|
    (?:(?:mr|mrs|approx|prof)\.)
  )*
)/gim

Один вкладыш /((?:\b(?:[a-z]\.){2,}|\b(?:[a-z]*[bcdfghjklmnpqrstvwxysß]{3,}\.)|\b(?:[a-z][bcdfghjklmnpqrstvwxysß]{2,}\.)|\b(?:[bcdfghjklmnpqrstvwxysß]+\.)|\b(?:\d*\.\d+)|\b(?:[a-z]\.)|[^\.\?\!]|(?:(?:mr|mrs|approx|prof)\.))*(MYSEARCHQUERY)(?:\b(?:[a-z]\.){2,}|\b(?:[a-z]*[bcdfghjklmnpqrstvwxysß]{3,}\.)|\b(?:[a-z][bcdfghjklmnpqrstvwxysß]{2,}\.)|\b(?:[bcdfghjklmnpqrstvwxysß]+\.)|\b(?:\d*\.\d+)|\b(?:[a-z]\.)|[^\.\?\!]|(?:(?:mr|mrs|approx|prof)\.))*)/gim

A В 10 раз быстрее один, но этот не улавливает однобуквенные аббревиатуры (A.) или исключения вроде (Проф. | Прибл.) ((?:\b(?:[a-z]\.){2,}|\b(?:[a-z]*[bcdfghjklmnpqrstvwxysß]{3,}\.)|\b(?:[a-z][bcdfghjklmnpqrstvwxysß]{2,}\.)|\b(?:[bcdfghjklmnpqrstvwxysß]+\.)|\b(?:\d*\.\d+)|[^\.\?\!])*(MYSEARCHQUERY)(?:\b(?:[a-z]\.){2,}|\b(?:[a-z]*[bcdfghjklmnpqrstvwxysß]{3,}\.)|\b(?:[a-z][bcdfghjklmnpqrstvwxysß]{2,}\.)|\b(?:[bcdfghjklmnpqrstvwxysß]+\.)|\b(?:\d*\.\d+)|[^\.\?\!])*)

Ссылка для попытки: https://regex101.com/r/KWAaoF/2

...