В соответствии с https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2011 двигатель регулярного выражения стандарта C++ 11 должен быть заполнен в GCC. Теперь, может кто-нибудь объяснить мне, почему этот простой примерC++ 11 regexp и GCC
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main()
{
string string_array[] = {"http://www.cplusplus.com/reference/regex/regex_match/",
"tcp://192.168.2.1:1234/hello/how/are/you",
"https://mail.google.com/mail/u/0/?tab=wm#inbox/15178022db56df29?projector=1"};
regex e("^(?:([A-Za-z]+):)?(\\/{0,3})([0-9.\\-A-Za-z]+)(?::(\\d+))?(?:\\/([^?#]*))?(?:\\?([^#]*))?(?:#(.*))?$");
for(int i=0; i<3; i++)
{
smatch sm;
regex_match (string_array[i],sm,e);
for (unsigned i=0; i<sm.size(); ++i)
{
cout << "[" << sm[i] << "] ";
}
cout << endl;
}
return 0;
}
результаты в этой продукции (примечание, например, неправильно обрабатывались номер порта второй линии, но там, кажется, много ошибок)
[http://www.cplusplus.com/reference/regex/regex_match/] [http] [//] [www.cplusplus.com/reference/regex] [] [regex_match/] [] []
[tcp://192.168.2.1:1234/hello/how/are/you] [tcp] [//] [192.168.2.1:1234/hello/how/are/you] [] [] [] []
[https://mail.google.com/mail/u/0/?tab=wm#inbox/15178022db56df29?projector=1] [https] [//] [mail.google.com/mail/u/0/?tab=wm] [] [] [] [inbox/15178022db56df29?projector=1]
в то время как его партнер python
import re
string_array = ["http://www.cplusplus.com/reference/regex/regex_match/",
"tcp://192.168.2.1:1234/hello/how/are/you",
"https://mail.google.com/mail/u/0/?tab=wm#inbox/15178022db56df29?projector=1"]
e = re.compile("^(?:([A-Za-z]+):)?(\\/{0,3})([0-9.\\-A-Za-z]+)(?::(\\d+))?(?:\\/([^?#]*))?(?:\\?([^#]*))?(?:#(.*))?$");
for i in range(len(string_array)):
m = e.match(string_array[i])
print(m.groups())
правильно распечатывает это?
('http', '//', 'www.cplusplus.com', None, 'reference/regex/regex_match/', None, None)
('tcp', '//', '192.168.2.1', '1234', 'hello/how/are/you', None, None)
('https', '//', 'mail.google.com', None, 'mail/u/0/', 'tab=wm', 'inbox/15178022db56df29?projector=1')
Я использую GCC 5.3.0 на ArchLinux
редактировать:
Я изменил программу этого, проверяя флаг регулярного выражения syntax_option_type
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main()
{
string string_array[] = {"http://www.cplusplus.com/reference/regex/regex_match/",
"tcp://192.168.2.1:1234/hello/how/are/you",
"https://mail.google.com/mail/u/0/?tab=wm#inbox/15178022db56df29?projector=1"};
regex e("^(?:([A-Za-z]+):)?(\\/{0,3})([0-9.\\-A-Za-z]+)(?::(\\d+))?(?:\\/([^?#]*))?(?:\\?([^#]*))?(?:#(.*))?$");
for(int i=0; i<3; i++)
{
smatch sm;
cout << "match: " <<regex_match (string_array[i],sm,e) << endl;
for (unsigned i=0; i<sm.size(); ++i)
{
cout << "[" << sm[i].str() << "] ";
}
}
cout << endl;
switch(e.flags())
{
case regex_constants::basic:
cout << "POSIX syntax was used" << endl;
break;
case regex_constants::awk:
cout << "POSIX awk syntax was used" << endl;
break;
case regex_constants::ECMAScript:
cout << "ECMA syntax was used" << endl;
break;
case regex_constants::egrep:
cout << "POSIX egrep syntax was used" << endl;
break;
}
return 0;
}
и удивительно я получаю в конце
match: 1
[http://www.cplusplus.com/reference/regex/regex_match/] [http] [//] [www.cplusplus.com/reference/regex] [] [regex_match/] [] [] match: 1
[tcp://192.168.2.1:1234/hello/how/are/you] [tcp] [//] [192.168.2.1:1234/hello/how/are/you] [] [] [] [] match: 1
[https://mail.google.com/mail/u/0/?tab=wm#inbox/15178022db56df29?projector=1] [https] [//] [mail.google.com/mail/u/0/?tab=wm] [] [] [] [inbox/15178022db56df29?projector=1]
ECMA syntax was used
это действительно, кажется, ошибка компилятора ..
https://gcc.gnu.org/bugs/ –
'regex_match' требует полного совпадения строк,' re.match' требует только совпадения в начале строки. –
@stribizhev Хорошо, но поскольку regex_match возвращает true, например re.match (который возвращает объект соответствия), в чем разница? – woggio