Я пытался заменить регулярное выражение на 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,{
Что я делаю не так, кто-нибудь знает?
Спасибо за помощь.
Проблема исходит от вашего первого (.+)
который жадный и захватить все, что он может, вероятно, до последнего #
предметной строки.
Вы можете попробовать с этим шаблоном:
const char *scriptRegexFullNameReplace = "$1\"$2\"#\"$3\"$4";
scriptRegexFullName.assign("(\\p{L}+,\\d+,\\d+,\\d+\\s+script\\s+)([^#]+)#(\\S+)(\\s+\\d+,\\{)");
Примечания:
p{L}
расшифровывается как любая буква Unicode, но вы можете попробовать заменить [^,]
если это проблема+
от ++
для большего количества выступлений (возвраты не допускаются)(.+?)
(точка с ленивым квантификатором), для представлений лучше использовать жадный квантификатор с уменьшенным классом символов: [^#]
который будет соответствовать всем персонажам до первого #
Других решений пока нет …