RegexKitLite: Выражение соответствия -> Совпадение с чем угодно, кроме] -> Совпадение] - PullRequest
1 голос
/ 03 декабря 2010

Я, по сути, пытаюсь заменить все сноски в большом тексте.Есть несколько причин, по которым я делаю это в Objective-C, поэтому, пожалуйста, примите это ограничение.

Каждая сноска существа с этим: [Сноска

Каждая сноска заканчивается этим:]

Между этими двумя маркерами может быть абсолютно все, включая разрывы строк.Однако между ними никогда не будет].

Итак, по сути, я хочу сопоставить [Сноска, затем сопоставить что угодно, кроме], пока] не будет сопоставлено.

Это самое близкое, что мне удалось найти для определения всех сносок:

NSString *regexString = @"[\\[][F][o][o][t][n][o][t][e][^\\]\n]*[\\]]";

Использование этого регулярного выражения позволяет идентифицировать сноски 780/889.Также кажется, что ни один из этих 780 не является ложной тревогой.Кажется, что пропускаются только те сноски, в которых есть разрывы строк.

Я потратил много времени на www.regular-expressions.info, в частности, на страницу о точках (http://www.regular -expressions.info / dot.html).Это помогло мне создать приведенные выше регулярные выражения, но я не совсем понял, как включить какой-либо символ или разрыв строки, кроме правой скобки.

Использование следующего регулярного выражения вместо этого позволяет захватить все сноски, но он захватывает слишком много текста, потому что * жадный: (?s)[\\[][F][o][o][t][n][o][t][e].*[\\]]

Вот пример текста, на котором выполняется регулярное выражение:

  <p id="id00082">[Footnote 1: In the history of Florence in the early part of the XVIth century <i>Piero di Braccio Martelli</i> is frequently mentioned as <i>Commissario della Signoria</i>. He was famous for his learning and at his death left four books on Mathematics ready for the press; comp. LITTA, <i>Famiglie celebri Italiane</i>, <i>Famiglia Martelli di Firenze</i>.—In the Official Catalogue of MSS. in the Brit. Mus., New Series Vol. I., where this passage is printed, <i>Barto</i> has been wrongly given for Braccio.</p>

  <p id="id00083">2. <i>addi 22 di marzo 1508</i>. The Christian era was computed in Florence at that time from the Incarnation (Lady day, March 25th). Hence this should be 1509 by our reckoning.</p>

  <p id="id00084">3. <i>racolto tratto di molte carte le quali io ho qui copiate</i>. We must suppose that Leonardo means that he has copied out his own MSS. and not those of others. The first thirteen leaves of the MS. in the Brit. Mus. are a fair copy of some notes on physics.]</p>

  <p id="id00085">Suggestions for the arrangement of MSS treating of particular subjects.(5-8).</p>

When you put together the science of the motions of water, remember to include under each proposition its application and use, in order that this science may not be useless.--

[Footnote 2: A comparatively small portion of Leonardo's notes on water-power was published at Bologna in 1828, under the title: "_Del moto e misura dell'Acqua, di L. da Vinci_".]

В этом примере естьдве сноски и некоторый текст не сноски.Первая сноска, как вы можете видеть, содержит в себе два переноса строк.Второй не содержит разрывов строк.

Первое регулярное выражение, которое я упомянул выше, сможет захватить сноску 2 в тексте этого примера, но оно не будет захватывать сноску 1, поскольку содержит разрывы строк.

Любые улучшения в моем регулярном выражении приветствуются.

1 Ответ

3 голосов
/ 03 декабря 2010

Попробуйте

@"\\[Footnote[^\\]]*\\]";

Это должно совпадать при переводе строк.Нет необходимости помещать один символ в класс символов.

В качестве многострочного регулярного выражения (без экранирования строк):

\[        # match a literal [
Footnote  # match literal "Footnote"
[^\]]*    # match zero or more characters except ]
\]        # match ]

Внутри класса символов ([...])каретка ^ приобретает другое значение;это отрицает содержание класса.Так что [ab] соответствует a или b, тогда как [^ab] соответствует любому символу, кроме a или b.

Конечно, если у вас есть вложенные сноски, это будет работать неправильно.Текст, такой как [Footnote foo [footnote bar] foo], будет совпадать с начала до bar].Чтобы избежать этого, измените регулярное выражение на

@"\\[Footnote[^\\]\\[]*\\]";

, чтобы нельзя было открывать или закрывать скобки.Тогда, конечно, вы сопоставляете только самые внутренние сноски и должны будете применять одно и то же регулярное выражение дважды (или больше, в зависимости от максимального уровня вложенности) ко всему тексту, «отгибая» слой за слоем.

...