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

Я пытался заменить регулярное выражение на 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,{

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

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

1

Решение

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

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

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

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

Примечания:

  • выход из фигурной скобки, вероятно, не требуется, попробуйте удалить его.
  • p{L} расшифровывается как любая буква Unicode, но вы можете попробовать заменить [^,] если это проблема
  • Вы можете заменить все + от ++ для большего количества выступлений (возвраты не допускаются)
  • Не нужно захватывать острый, чтобы заменить его самому, это причина, по которой шаблон имеет только четыре группы захвата
  • Вместо того, чтобы использовать (.+?) (точка с ленивым квантификатором), для представлений лучше использовать жадный квантификатор с уменьшенным классом символов: [^#] который будет соответствовать всем персонажам до первого #
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]