Обратный поиск регулярного выражения, совпадающего со словом, предшествующим выражению в скобках

Можно ли использовать выражение ретроспективного выражения Regex для сопоставления всех слов, предшествующих тому, что находится в квадратных скобках, сопоставляя слова consectetur и libero в этом примере?

Lorem ipsum dolor sit amet, consectetur [adipiscing] elit. Nunc eutellus vel nunc pretium lacinia. Proin sed lorem. Cras sed ipsum. Nunc a libero [quis] risus sollicitudin imperdiet.

Я хочу отделить словарные статьи в MS Word от содержимого записи. Записи сопровождаются фонетической транскрипцией в квадратных скобках, и после того, как они выбраны таким образом, я бы увеличил их шрифт, чтобы они отличались от остального текста и отделялись от содержимого.

EDIT: выражение, которое дал Кент, отлично работает с однословными записями, например:

кипение ['boilin] прил. 1. vreo, uzavreo, kipući 2. razjaren, uzrujan

с дефисными записями из двух слов, такими как:

точка кипения ['boilin point] s vrelište

но первое слово фразовых глаголов и других записей, состоящих из двух слов, опущено, что означает, что в таких записях, как:

болтать ['bault'aut] vt isključiti; изланути

совпадение вышло, а не выскочило, как мне было бы нужно.

Поскольку это словарь, и я могу применить выражение регулярного выражения для каждого диапазона букв отдельно, я смог бы решить эту проблему, если бы у меня было регулярное выражение, которое будет искать первое слово, начинающееся с определенной буквы, которая предшествует скобкам, сопоставьте это слово и слово, следующее за ним. Для записей «B», как в моих примерах, это будет означать, что выражение будет соответствовать либо отдельным словам, начинающимся с буквы B, записям из двух слов с дефисом как точка кипения и будет соответствовать «bolt » во фразовых глаголах, таких как «болтнуть», вместе с предлогом, который следует за ним, т. е. «out» в данном случае.

В моем словаре может быть всего несколько статей из двух слов, если они вообще есть, где слова в этих статьях начинаются с одной и той же буквы, и я действительно могу жить с такой небольшой погрешностью.

EDIT2: я поместил разрывы абзацев перед квадратными скобками, и теперь у меня есть записи в конце предыдущей строки, например:

[aidwulf] s zool vrsta hijene (Proteles cristata) Борода Арона

[earanzrod] s bot divizma (Verbascum Thapsus) Abacca

[a'baid'on] vi biti na pomoći, stajati uz bok abide with

Борода Аарона — это запись для второй строки, начинающаяся с квадратных скобок, Abacca — это запись для третьей строки, начинающаяся с квадратных скобок, и так далее.

Чтобы решить мою проблему, мне нужны два регулярных выражения. Во-первых, мне нужно регулярное выражение для соответствия каждой букве Aa в словах, начинающихся с Aa, и только в словах перед последним в каждой строке. В моих примерах это соответствует A в Aaron's в первом примере и a в abide в третьем примере. Затем я заменю эту букву на звездочку, чтобы получить *бороду Рона и *поддерживаю

Второе регулярное выражение будет соответствовать каждому последнему слову (включая составные двухсловные через дефис) в каждой строке и словах, начинающихся со звездочки, которые я ранее создал.

Спасибо вам за помощь.


person TotoKalvera    schedule 16.04.2013    source источник
comment
Пожалуйста, расширьте свой пример. Что именно вы хотите получить в результате сопоставления строки с регулярным выражением? И как сейчас выглядит выражение, с которым вы работаете? Вы пытаетесь сопоставить скобки?   -  person Till Helge    schedule 16.04.2013
comment
какое понимание правильное? 1) вы хотите сопоставить с начала строки до первого [foo] 2) вы хотите сопоставить с первого b/B до первого [foo]?   -  person Kent    schedule 19.04.2013
comment
2) это то, что я ищу Кент, я хочу найти соответствие от первого (ближайшего к скобкам) ​​слова, начинающегося с буквы B, до первых квадратных скобок.   -  person TotoKalvera    schedule 19.04.2013


Ответы (1)


нужно смотреть вперед, а не назад:

\w+(?=\s*\[[^]])

тест с grep:

kent$  echo "Lorem ipsum dolor sit amet, consectetur [adipiscing] elit. Nunc eu tellus vel nunc pretium lacinia. Proin sed lorem. Cras sed ipsum. Nunc a libero [quis] risus sollicitudin imperdiet."|grep -Po '\w+(?=\s*\[[^\]])'
consectetur
libero

ИЗМЕНИТЬ

попробуйте это регулярное выражение:

[bB].+?(?=\s*\[[^]])

все еще тест с grep:

kent$  cat file
boiling ['boilin] adj 1. vreo, uzavreo, kipući 2. razjaren, uzrujan
with hyphenated two-word entries such as:
boiling-point ['boilin point] s vrelište
but the first word of phrasal verbs and other two-word entries is left out, which means that in the entries such as:
bolt out ['bault'aut] vt isključiti; izlanuti

kent$  grep -oP '[bB].+?(?=\s*\[[^]])' file
boiling
boiling-point
bolt out
person Kent    schedule 16.04.2013
comment
Огромное спасибо, Кент, это прекрасно работает для записей, состоящих из одного слова! Возможно ли, чтобы это выражение включало записи из нескольких слов, разделенные дефисом, например, крест-накрест в совпадении? - person TotoKalvera; 16.04.2013
comment
попробуй поменять \w на [\w-] - person Kent; 16.04.2013
comment
Теперь все идеально на сто процентов :) Большое спасибо, Кент! - person TotoKalvera; 16.04.2013
comment
Я не знал, что некоторые записи будут фразовыми глаголами и похожими записями из двух слов, Кент, и теперь у меня проблема. Запись, предшествующая скобкам, выделена жирным шрифтом, можете ли вы дать выражение, которое уловит все, что выделено жирным шрифтом? перед скобками? - person TotoKalvera; 18.04.2013
comment
Регулярное выражение @TotoKalvera может соответствовать тексту, но не может обрабатывать стиль ... регулярное выражение не может соответствовать полужирному, курсиву ... размер шрифта = n и т. д. - person Kent; 18.04.2013
comment
Спасибо, Кент, позвольте мне задать еще один вопрос, пожалуйста. Возможно ли, чтобы это выражение смотрело перед скобками, пока не совпало со словом, начинающимся с определенной буквы, и сопоставило это слово и все, что следует за ним, до скобок? Это бы решило мою проблему :) - person TotoKalvera; 18.04.2013
comment
@TotoKalvera, не могли бы вы отредактировать свой вопрос и привести пример для нового требования, пожалуйста? - person Kent; 18.04.2013
comment
@TotoKalvera проверьте EDIT в ответе. - person Kent; 19.04.2013
comment
Это работает, yahooo! Я проверил образец из своего словаря, он идеален, большое спасибо, Кент. - person TotoKalvera; 19.04.2013
comment
@TotoKalvera, вы могли бы проголосовать за мой ответ, чтобы сказать спасибо. :D рад помочь. - person Kent; 19.04.2013
comment
Я бы проголосовал сто раз, Кент, но я не могу, у меня недостаточно репутации (у меня 8, а нужно 15), чтобы проголосовать. - person TotoKalvera; 19.04.2013
comment
Кент, попробовал еще раз, и, к сожалению, возникла проблема, извините за беспокойство. Когда у меня есть две квадратные скобки в одной строке, выражение соответствует словам, начинающимся с B внутри первых квадратных скобок, даже если слово не начинается с B, выбирает любое B в слове и начинается новое совпадение, которое заканчивается до следующих квадратных скобок. Вы можете исправить это, пожалуйста, Кент? - person TotoKalvera; 19.04.2013
comment
Проблема с запуском совпадений со слов в скобках решена, но по-прежнему выбирает букву B в середине слова и начинает новое совпадение, в случаях, когда в строке больше одной квадратной скобки. Когда у меня в строке только одна квадратная скобка, никаких проблем. - person TotoKalvera; 19.04.2013
comment
@TotoKalvera это то, что делает совпадение регулярных выражений. Если ваша цель всегда находится в начале строки, вы можете добавить ^ в начало регулярного выражения. в противном случае текст типа xxfooxxfooxxfooxx, если регулярное выражение foo, имеет 3 совпадения. look-behind не поддерживает динамическую длину. - person Kent; 19.04.2013
comment
Я понимаю Кента. Я думаю, что нашел способ решить свою проблему, надеюсь, это не помешает вам попробовать еще раз. Я отредактировал свой исходный пост, он находится под EDIT2, не могли бы вы взглянуть? - person TotoKalvera; 19.04.2013