Regex: удалить все теги, кроме тех, которые содержат ключевое слово univ

[introduction][position]Lead Researcher and Research Manager[/position] in the [affiliation]Web Search and Mining Group, Microsoft Research[/affiliation]</b>.

I am a [position]lead researcher[/position] at [affiliation]Microsoft Research[/affiliation]. I am also [position]adjunct professor[/position] of [affiliation]Peking University[/affiliation], [affiliation]Xian Jiaotong University[/affiliation] and [affiliation]Nankai University[/affiliation].

I joined [affiliation]Microsoft Research[/affiliation] in June 2001. Prior to that, I worked at the Research Laboratories of NEC Corporation.

I obtained a [bsdegree]B.S.[/bsdegree] in [bsmajor]Electrical Engineering[/bsmajor] from [bsuniv]Kyoto University[/bsuniv] in [bsdate]1988[/bsdate] and a [msdegree]M.S.[/msdegree] in [msmajor]Computer Science[/msmajor] from [msuniv]Kyoto University[/msuniv] in [msdate]1990[/msdate]. I earned my [phddegree]Ph.D.[/phddegree] in [phdmajor]Computer Science[/phdmajor] from the [phduniv]University of Tokyo[/phduniv] in [phddate]1998[/phddate].

I am interested in [interests]statistical learning[/interests], [interests]natural language processing[/interests], [interests]data mining, and information retrieval[/interests].[/introduction]

Я могу удалить все теги из абзаца выше с помощью:

String stripped = html.replaceAll("\\[.*?\\]", "");

Но я бы хотел оставить в абзаце три пары тегов: [bsuniv][/bsuniv], [msuniv][/msuniv] и [phduniv][/phduniv]. Другими словами, я не хочу удалять те теги, которые содержат ключевое слово "univ". Я не могу найти удобный способ переписать регулярное выражение. Кто-нибудь поможет мне?


person Terry Li    schedule 17.12.2012    source источник


Ответы (1)


Здесь вы можете использовать утверждение negative-look ahead: -

str = str.replaceAll("\\[(.(?!univ))*?\\]", "");

or: -

str = str.replaceAll("\\[((?!univ).)*?\\]", "");

Оба они дадут вам желаемый результат. Есть только одно отличие -

  • Первый выполняет отрицательный просмотр вперед относительно текущего символа, и если за ним не следует univ, он переходит к следующему символу.
  • Второй выполняет отрицательный просмотр пустой строки перед каждым символом, и если за ним не следует univ, выполняется поиск совпадения с одним символом.
person Rohit Jain    schedule 17.12.2012