Регулярное выражение Boost не заменяет выражение, которое правильно заменяет на веб-сайтах регулярных выражений

Я пытался заменить регулярное выражение на boost :: regex, но, похоже, это не работает.

Вот выражение регулярного выражения:

(\\w+,\\d+,\\d+,\\d+\tscript\t)(.+)(#)(.+)(\t\\d+(,\\d+)?(,\\d+)?,{)

И форматтер:

$1\"$2\"$3\"$4\"$5

Код: (getInput () возвращает строку с содержимым, которое должно совпадать)

std::string &Preprocessor::preprocess()
{
    std::string &tempString = getInput();
    boost::regex scriptRegexFullName;
    const char *scriptRegexFullNameReplace = "$1\"$2\"$3\"$4\"$5";

    scriptRegexFullName.assign("(\\w+,\\d+,\\d+,\\d+\tscript\t)(.+)(#)(.+)(\t\\d+(,\\d+)?(,\\d+)?,{)");

    tempString = boost::regex_replace(tempString, scriptRegexFullName, scriptRegexFullNameReplace, boost::match_default);

    return tempString;
}

Когда я помещаю следующие тестовые примеры на этот веб-сайт:

alberta,246,82,3    script  Marinheiro#bra2 100,{
brasilis,316,57,3   script  Marinheiro#bra1 100,{
brasilis,155,165,3  script  Orientação divina#bra1  858,{

Вывод сайта правильный:

alberta,246,82,3    script  "Marinheiro"#"bra2" 100,{
brasilis,316,57,3   script  "Marinheiro"#"bra1" 100,{
brasilis,155,165,3  script  "Orientação divina"#"bra1"  858,{

Но с boost :: regex вывод:

alberta,246,82,3    script  "Marinheiro#bra2    100,{
brasilis,316,57,3   script  Marinheiro#bra1 100,{
brasilis,155,165,3  script  Orientação divina#bra1  858,{

Кто-нибудь знает, что я делаю не так?

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


person RenatoUtsch    schedule 11.08.2013    source источник
comment
Я подозреваю, что у вас начались головные боли, связанные с местными условиями ...   -  person Billy ONeal    schedule 11.08.2013
comment
Что произойдет, если вы выйдете из конечного {? { - метасимвол регулярного выражения.   -  person Billy ONeal    schedule 11.08.2013
comment
@BillyONeal, ничего не меняется, когда я избегаю конечного {... но я все равно добавлю его, не знал, что это метасимвол регулярного выражения.   -  person RenatoUtsch    schedule 11.08.2013
comment
@BillyONeal Возможно ... файл, который я открываю, использует набор символов Windows-1252 (ANSI), и когда я пытаюсь указать такой символ, как ç или á, регулярное выражение не работает. Но проблема в том, что даже без этих символов регулярное выражение все равно не работает. Если я изменю два .+ на [a-fA-F0-9_ ], это будет работать, но мне нужно добавить поддержку других символов, а выполнение [a-fA-F0-9_áÁàÀâÂãÃéÉíÍóÓôÔúÚüÜçÇ ] не работает.   -  person RenatoUtsch    schedule 11.08.2013


Ответы (1)


Проблема исходит от вашего первого (.+), который жадно схватывает все, что может, вероятно, до последнего # строки темы.

Вы можете попробовать с этим шаблоном:

const char *scriptRegexFullNameReplace = "$1\"$2\"#\"$3\"$4";

scriptRegexFullName.assign("(\\p{L}+,\\d+,\\d+,\\d+\\s+script\\s+)([^#]+)#(\\S+)(\\s+\\d+,\\{)");

Уведомления:

  • Возможно, выход фигурной скобки не нужен, попробуйте удалить его.
  • p{L} обозначает любую букву юникода, но вы можете попробовать заменить ее на [^,], если это проблема
  • Вы можете заменить все + на ++ для большей производительности (без возврата)
  • Нет необходимости захватывать диез, чтобы заменить его самим собой, поэтому в шаблоне всего четыре группы захвата.
  • вместо использования (.+?) (точка с ленивым квантификатором) для выступлений лучше использовать жадный квантификатор с сокращенным классом символов: [^#], который будет соответствовать всем символам до первого #
person Casimir et Hippolyte    schedule 11.08.2013
comment
Это была моя первая мысль, но поскольку позже в регулярном выражении есть необязательные символы, я не мог понять, как совпадают, если + был слишком жадным, я не пошел по этому пути. Хорошая работа. - person Billy ONeal; 11.08.2013
comment
Следуя вашим советам, я пришел к следующему: (\\w++,\\d++,\\d++,\\d++\tscript\t)([^#]++)#([^\t]++)(\t\\d++(,\\d++)?(,\\d++)?,{) (\ t являются частью ужасного старого языка, над которым я работаю, поэтому они должны оставаться на этом уровне). Работало безупречно. Я не думал об использовании [^ #], это отличная идея. Спасибо за помощь, я узнал несколько хороших вещей о регулярном выражении с вашим ответом. - person RenatoUtsch; 11.08.2013