Что регулярное выражение в Java может захватить и удалить этот шаблон? - PullRequest
2 голосов
/ 02 ноября 2011

Предположим, у меня есть несколько строк из XML-файла википедии, которые выглядят так:

[[Image: ChicagoAnarchists.jpg | thumb | Сочувствующая гравюра [[Walter Crane]] исполненного лица«Анархисты Чикаго» после [дела Хеймаркета].Дело Хеймаркета, как правило, считается наиболее значимым событием для возникновения международных [[Первомайских]] событий]]. В 1907 году [[Международный анархистский конгресс Амстердама]] собрал делегатов из 14 различных стран, среди которых важные фигурыанархистское движение, включая [[Errico Malatesta]]

Я хочу удалить строку, начинающуюся с [[Image:" and closed by "observances]].Может быть несколько других строк текста, которые также содержат скобки, и я не хочу выполнять жадный поиск, иначе он может случайно удалить и эти другие скобки.

Например, если я только что сделал жадный \\[\\[Image:.*\\]\\], я полагаю, это удалит все до последних заключительных скобок (Эрико Малатеста)

Есть ли регулярное выражение, которое может сделать это легче для меня?

Ответы [ 5 ]

2 голосов
/ 02 ноября 2011

Давайте посмотрим ... как насчет использования ленивых повторений вместо жадных?

\[\[Image:.*?observances\]\]
0 голосов
/ 02 ноября 2011

Используя следующую тестовую строку (обратите внимание, я добавил туда еще [[image:foobar[[foo [baz] bar]]foobar]]):

[[Image:ChicagoAnarchists.jpg|thumb|A sympathetic engraving by [[Walter Crane]] of the executed \"Anarchists of Chicago\" after the [[Haymarket affair]]. The Haymarket affair is generally considered the most significant event for the origin of international [[May Day]] observances]] In 1907, the [[International Anarchist Congress of[[image:foobar[[foo [baz] bar]]foobar]] Amsterdam]] gathered delegates from 14 different countries, among which important figures of the anarchist movement, including [[Errico Malatesta]]

И шаблон регулярного выражения:

(?i)\\[\\[image:(?:\\[\\[(?:(?!(?:\\[\\[|]])).)*]]|(?:(?!(?:\\[\\[|]])).)*?)*?]]

testString.replaceAll(<above pattern>, "")вернет:

 In 1907, the [[International Anarchist Congress of Amsterdam]] gathered delegates from 14 different countries, among which important figures of the anarchist movement, including [[Errico Malatesta]]

Вот более подробное объяснение регулярного выражения:

(?i)                    # Case insensitive flag
\[\[image:              # Match literal characters '[[image:'
(?:                     # Begin non-capturing group
  \[\[                  # Match literal characters '[['
  (?:                   # Begin non-capturing group
    (?!                 # Begin non-capturing negative look-ahead group
      (?:               # Begin non-capturing group
        \[\[            # Match literal characters '[['
        |               # Match previous atom or next atom
        ]]              # Match literal characters ']]'
      )                 # End non-capturing group
    )                   # End non-capturing negative look-ahead group
    .                   # Match any character
  )                     # End non-capturing group
  *                     # Match previous atom zero or more times
  ]]                    # Match literal characters ']]'
  |                     # Match previous atom or next atom
  (?:                   # Begin non-capturing group
    (?!                 # Begin non-capturing negative look-ahead group
      (?:               # Begin non-capturing group
        \[\[            # Match literal characters '[['
        |               # Match previous atom or next atom
        ]]              # Match literal characters ']]'
      )                 # End non-capturing group
    )                   # End non-capturing negative look-ahead group
    .                   # Match any character
  )                     # End non-capturing group
  *?                    # Reluctantly match previous atom zero or more times
)                       # End non-capturing group
*?                      # Reluctantly match previous atom zero or more times
]]                      # Match literal characters ']]'

Это будет обрабатывать только один уровень вложенных шаблонов [[...]].Как отмечалось в этом ответе на этом вопросе , который TJR прокомментировал выше, регулярные выражения не будут обрабатывать неограниченные вложенные атомы.Таким образом, этот шаблон регулярного выражения не будет совпадать с чем-то вроде [[foo[[baz]]bar]] в строке [[image:...]].

Для получения справки о регулярных выражениях см. Regular-Expressions.info .

0 голосов
/ 02 ноября 2011

Может быть так:

(.*?\\[\\[[^\\[]*?\\]\\][^\\[]*\\]\\])

Я пытался

public class My {

public static void main(String[] args) {
    String foo = "[[Image:ChicagoAnarchists.jpg|thumb|A sympathetic engraving by [[Walter Crane]] of the executed \"Anarchists of Chicago\" after the [[Haymarket affair]]. The Haymarket affair is generally considered the most significant event for the origin of international [[May Day]] observances]] In 1907, the [[International Anarchist Congress of Amsterdam]] gathered delegates from 14 different countries, among which important figures of the anarchist movement, including [[Errico Malatesta]]";
    Matcher m = Pattern.compile("(.*?\\[\\[[^\\[]*?\\]\\][^\\[]*\\]\\])").matcher(foo);
    while (m.find()) {
        System.out.print(m.group(1));
    }
}}

И он печатает

[[Image:ChicagoAnarchists.jpg|thumb|A sympathetic engraving by [[Walter Crane]] of the executed "Anarchists of Chicago" after the [[Haymarket affair]]. The Haymarket affair is generally considered the most significant event for the origin of international [[May Day]] observances]]

Надеюсь, это поможет: D

0 голосов
/ 02 ноября 2011

Это работает:

str.replaceAll("^\\[\\[([^\\[]*?(\\[\\[[^\\]]*\\]\\])?[^\\[]*?)*?\\]\\]\\s*", "");

Вывод из вашего ввода:

In 1907, the [[International...

Это работает, потому что ищет подходящие пары [[ и ]] (и окружающий текст) внутри первая такая пара.

0 голосов
/ 02 ноября 2011

Что случилось с этим примером?

s.replaceAll("(\\[{2}Image:(?:(?:\\[{2}).*\\]{2}|[^\\[])*\\]{2})", "");

Заменил бы только этот текст:

  • [[Image:ChicagoAnarchists.jpg|thumb|A sympathetic engraving by [[Walter Crane]] of the executed "Anarchists of Chicago" after the [[Haymarket affair]]. The Haymarket affair is generally considered the most significant event for the origin of international [[May Day]] observances]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...