Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2017, 11:18   #1
Андрей Цапко
Пользователь
 
Регистрация: 10.04.2017
Сообщений: 66
По умолчанию Регулярные выражения

Здравствуйте. Надо написать класс URL на подобии js-овского. Нашел исходник на js с регулярным выражением. Все работает. Теперь нужно переписать это на С++, но компилятор выдает ошибку на регулярное выражение и я не понимаю что к чему.

Вот код с++:
Код:
#include <iostream>
#include <cstring>
#include <regex>

using std::cout;
using std::endl;
using std::regex;
using std::cmatch;
using std::string;

class Url{
public:
	string scheme;
	string user;
	string pass;
	string host;
	string port;
	string path;
	string query;
	string hash;

	Url(const char *url){
		this->url=url;
	}

private:
	string url;
	regex regular("^(([^:/\\?#]+):)?(//(([^:/\\?#]*)(?::([^/\\?#]*))?))?([^\\?#]*)(\\?([^#]*))?(#(.*))?$");
	cmatch result;
	
};

int main(){
	cout<<"hello"<<endl;
	return 0;
}
если вдруг понадобиться вот код на js:
Код:
function TEST(url) {
	url=url || "";
	this.parse(url);
}
TEST.prototype = {
	href: "",
	protocol: "",
	host: "",
	hostname: "",
	port: "",
	pathname: "",
	search: "",
	hash: "",

	parse: function(url) {
		url = url || this.href;
		var pattern = "^(([^:/\\?#]+):)?(//(([^:/\\?#]*)(?::([^/\\?#]*))?))?([^\\?#]*)(\\?([^#]*))?(#(.*))?$";
		var rx = new RegExp(pattern); 
		var parts = rx.exec(url);

		this.href = parts[0] || "";
		this.protocol = parts[1] || "";
		this.host = parts[4] || "";
		this.hostname = parts[5] || "";
		this.port = parts[6] || "";
		this.pathname = parts[7] || "/";
		this.search = parts[8] || "";
		this.hash = parts[10] || "";

		this.update();
	},

	update: function() {
		if (!this.protocol)
			this.protocol = window.location.protocol;
		this.pathname = this.pathname.replace(/^\s*/g, '');
		if (!this.host && this.pathname && !/^\//.test(this.pathname)) {
			var _p = window.location.pathname.split('/');
			_p[_p.length - 1] = this.pathname;
			this.pathname = _p.join('/');
		};
		if (!this.hostname)
			this.hostname = window.location.hostname;

		this.host = this.hostname + (("" + this.port) ? ":" + this.port : "");
		this.href = this.protocol + '//' + this.host + this.pathname + this.search + this.hash;
	}
}
компилятор выдает следующее:
Цитата:
/var/www/lib/url.class.cpp:28:16: error: expected identifier before string constant
regex regular("^(([^:/\\?#]+)?(//(([^:/\\?#]*)(?:[^/\\?#]*))?))?([^\\?#]*)(\\?([^#]*))?(#(.*))?$");
/var/www/lib/url.class.cpp:28:16: error: expected ‘,’ or ‘...’ before string constant
что именно он хочет от меня? какая "," и "..."?

Последний раз редактировалось Андрей Цапко; 22.09.2017 в 11:25.
Андрей Цапко вне форума Ответить с цитированием
Старый 22.09.2017, 11:21   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Инициализируйте в конструкторе, это ж С++.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 22.09.2017, 11:25   #3
Андрей Цапко
Пользователь
 
Регистрация: 10.04.2017
Сообщений: 66
По умолчанию

Всмысле? А как я инициализирую?
Код:
regex regular("^(([^:/\\?#]+):)?(//(([^:/\\?#]*)(?::([^/\\?#]*))?))?([^\\?#]*)(\\?([^#]*))?(#(.*))?$");
Это и есть конструктор.

Последний раз редактировалось Андрей Цапко; 22.09.2017 в 11:28.
Андрей Цапко вне форума Ответить с цитированием
Старый 22.09.2017, 11:45   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Экранируйте или raw строки.
p51x вне форума Ответить с цитированием
Старый 22.09.2017, 11:47   #5
Андрей Цапко
Пользователь
 
Регистрация: 10.04.2017
Сообщений: 66
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Экранируйте или raw строки.
Что именно экранировать? или что такое "raw строки"?
Андрей Цапко вне форума Ответить с цитированием
Старый 22.09.2017, 11:59   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

В С++ нельзя прямо в объявлении поля конструктор вызывать (или в новом стандарте уже можно?)

Надо так:
Код:
Url(const char *u)
  : url(u),
    regular("......")
{ }
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 22.09.2017, 12:03   #7
Андрей Цапко
Пользователь
 
Регистрация: 10.04.2017
Сообщений: 66
По умолчанию

В новом стандарте можно. Я вызывал конструктор собственных классов при объявлении. В общем спасибо большое, помогло.
Андрей Цапко вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регулярные выражения Артём555 C# (си шарп) 4 28.04.2013 14:02
Регулярные выражения 7flash Microsoft Office Word 1 25.02.2013 19:51
Регулярные выражения sem_1989 JavaScript, Ajax 2 06.08.2011 21:45
регулярные выражения Dimarik PHP 10 09.12.2010 21:19
Регулярные выражения Dima_D Общие вопросы Delphi 0 11.08.2010 21:16