Замена на подгруппу
Есть код на Lazarus с использованием библиотеки RegExpr и код, заменяющий повторяющиеся слова подряд без учета регистра. Не получается заменить, работает не так, подскажите, что я делаю не так.
program Project1;
uses
RegExpr;
var
f:textfile;
buf, text, text_after:string;
reg:TRegExpr;
begin
AssignFile(f, 'test.txt');
Reset(f);
text:='';
while not Eof(f) do
begin
readln(f, buf);
text:=text+buf;
end;
buf:='';
reg:=TRegExpr.Create;
reg.Expression:='\b(\w+)(?:\s+\1\b)+';
reg.ModifierI:=True;
if (reg.Exec(text)) then
text_after:=reg.Replace(text,'$1');
CloseFile(f);
end.
Файл test.txt: 'hello hi hello Hello 123 321 you You the are'
Переменная после замены: 'hello hi $1 123 321 $1 the are'
Код на C++, делающий такие же действия, но работает:
#include <regex>
#include <iostream>
#include <fstream>
using namespace std;
string readf(const string& filename)
{
ifstream file(filename);
if (!file.is_open())
{
throw exception("File not foind!");
}
string text, buf;
while (!file.eof())
{
getline(file, buf);
text += buf;
}
file.close();
return text;
}
int main()
{
cout << "Filename: ";
string filename;
cin >> filename;
string text = readf(filename);
regex pat("\\b(\\w+)(?:\\s+\\1\\b)+", regex_constants::ECMAScript | regex_constants::icase);
cout << "Text before: " << text << endl;
text = regex_replace(text, pat, "$1");
cout << "Text after: " << text;
cin.get();
cin.get();
return 0;
}