Регулярное выражение с позитивным взглядом вперед сбивает с толку

Я создаю это регулярное выражение с позитивным взглядом на него. По сути, он должен выбрать весь текст в строке до последней точки, которая предшествует «:», и добавить «|» до конца, чтобы разграничить его. Пример текста ниже. Я тестирую это в gskinner и editpadpro, которые, по-видимому, имеют полную поддержку регулярных выражений grep, поэтому, если бы я мог получить ответы, я был бы признателен.

Регулярное выражение ниже работает до некоторой степени, но я не уверен, правильно ли оно. Также он падает, если текст содержит скобки.

Наконец, я хотел бы добавить еще одно правило игнорирования, подобное тому, которое игнорирует, но включает «Ко». в выборе. Это второе правило игнорирования будет игнорировать, но включать точки, перед которыми стоит одна заглавная буква. Пример текста также ниже. Спасибо за помощь.

^(?:[^|]+\|){3}(.*?)[^(?:Co)]\.(?=[^:]*?\:)

121| Ryan, T.N. |2001. |I like regex. But does it like me (2) 2: 615-631.
122| O' Toole, H.Y. |2004. |(Note on the regex). Pages 90-91 In: Ryan, A. & Toole, B.L. (Editors) Guide to the regex functionality in php. Timmy, Tommy& Stewie, Quohog. * Produced for Family Guy in Quohog.

person jiraiya    schedule 29.09.2011    source источник
comment
Если используемый вами механизм регулярных выражений существенно не отличается от Perl, [^(?:Co)] соответствует любому одиночному символу, который не является одним из :()?Co. Вы, конечно, не это имели в виду, не так ли?   -  person Colin Fine    schedule 29.09.2011
comment
это сделано для того, чтобы он разрешил Co. в тексте, не рассматривая Co. как конец совпадения.   -  person jiraiya    schedule 29.09.2011
comment
Но то, что вы на самом деле сказали, соответствует всему, оканчивающемуся на . непосредственно предшествует символ, который не является ни одним из ()?:Co. Таким образом, он не будет соответствовать Fine, C., потому что символ, предшествующий . С   -  person Colin Fine    schedule 30.09.2011


Ответы (2)


Кажется, я не понимаю, что ты хочешь сделать. Но эта часть [^(?:Co)] определенно неверна.

С помощью квадратных скобок вы создаете класс символов, поскольку ^ это отрицательный класс. Это означает, что в этом месте вы не хотите совпадать ни с одним из этих символов (?:Co), другими словами, он будет совпадать с любым другим символом, кроме "?)(:Co".

Обновление:

Я не думаю, что это возможно. Как мне отличить L. Co. или что-то подобное от конца предложения?

Но я нашел еще одну ошибку в вашем регулярном выражении. Последняя часть (?=[^:]*?\:) должна быть (?=[^.]*?\:), если вы хотите сопоставить последнюю точку перед : с вашим выражением, которое будет соответствовать первой точке.

См. здесь, на Regexr.

person stema    schedule 29.09.2011
comment
Спасибо за ответ. Я хочу выделить весь текст до последней точки (точки), которая стоит перед :, а затем добавить | символ до конца, чтобы разграничить его. Часть Co. существует, поэтому она пропускает, но все же включает экземпляры, в которых встречается Co., поскольку это не нарушает регулярное выражение здесь. Я также хочу пропустить такие элементы, как L., которые могут быть именами и так далее. - person jiraiya; 29.09.2011
comment
большое спасибо, это именно то, что я хотел. Части Co. или L. вообще не встречаются в конце строки и не встречаются после последней точки, все отлично работает, еще раз спасибо - person jiraiya; 29.09.2011

Это похоже делает то, что вы хотите.

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

Он просто сопоставляет весь текст до последней точки перед двоеточием.

person Herbert    schedule 29.09.2011