boost :: regex - \ bb? - PullRequest
       16

boost :: regex - \ bb?

5 голосов
/ 29 ноября 2010

У меня есть немного плохо прокомментированный старый код, который использует boost::regex::perl.Раньше я задавался вопросом об одной конкретной конструкции, но поскольку код работал (более или менее), мне не хотелось его трогать.

Теперь у меня есть , чтобы коснуться его по техническим причинамточнее, текущие версии Boost больше не принимают конструкцию), поэтому я должен выяснить, что он делает - или, скорее, намеревался сделать.

Соответствующая часть регулярного выражения:

(?<!(\bb\s|\bb|^[a-z]\s|^[a-z]))

Часть, которая вызывает у меня головную боль \bb.Я знаю о \b, но я не смог найти упоминания о \bb, и поиск буквального значения 'b' не имеет здесь смысла.\bb - это какая-то особая недокументированная функция, или я должен считать это опечаткой?

Ответы [ 2 ]

4 голосов
/ 29 ноября 2010

Поскольку Boost кажется механизмом регулярных выражений для C ++, а one режимов совместимости - это совместимость perl - если это выражение "совместимо с perl", чем второй 'b' может только быть буквальным.

Это правильное выражение, в значительной степени особый случай для слов, начинающихся с 'b'.

Кажется, решающим фактором является то, что это библиотека c ++, и что она должна предоставлять средам, которые не являются perl-совместимыми с perl регулярными выражениями. Таким образом, моя первоначальная мысль, что perl может интерпретировать выражение (скажем, с помощью overload::constant), неверна. И все же стоит упомянуть только для пояснения, независимо от того, насколько нецелесообразным было бы подгонять выражение, означающее «слово, начинающееся с« б »».

Единственная оговорка к этой идее заключается в том, что возможно Boost превосходит Perl по собственному выражению, и кто-то будет использовать Boost в среде Perl, тогда все ставки сделаны от того, могло ли это быть предназначено как специальное выражение. Это всего лишь один удар, учитывая грамматику, где '!!!' означало что-то особенное в начале слов, вы могли бы добавить в установленное значение, как это (НЕ РЕКОМЕНДУЕТСЯ!)

s/\\bb\b/(?:!!!(\\p{Alpha})|\\bb)/

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

3 голосов
/ 29 ноября 2010

(\bb\s|\bb|^[a-z]\s|^[a-z]) соответствует b, если ему не предшествует другой символ слова, или любая строчная буква, если она находится в начале строки. В любом случае за буквой может следовать символ пробела. (Он также может совпадать с заглавными буквами, если установлен режим без учета регистра, и ^ может также соответствовать началу строки, если установлен многострочный режим.)

Но, если смотреть назад, то не должно быть даже скомпилированного . В некоторых вариантах внешний вид может содержать несколько альтернатив с разными фиксированными длинами, но чередование должно быть на верхнем уровне. То есть (?<=abc|xy|12345) будет работать, но (?<=(abc|xy|12345)) не будет. Таким образом, ваше регулярное выражение не будет работать даже в этих вариантах, но в документах Boost говорится, что выражение lookbehind должно быть фиксированной длины.

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

(?<!\bb|^[a-z])(?<!(?:\bb|^[a-z])\s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...