Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Регулярни изрази C++ / C++11

Featured Replies

 Здравейте всички!
Имам за курсово задание да напиша конзолна програма, която чрез регулярни изрази да търси в текстов файл за серийни номера.
Валидността на серийните номера отговаря на следните критерии:
1. Започва с някоя от буквите: P, W,C,N
2. След буквата имаме 5 шестнадесетични числа, като може да са с големи  букви или малки (A-F)
3. При използването на смесени букви (големи и малки) за числата, серийният номер е валиден,

За нагледно ще дам 3 валидни израза: P10000, Ca10FF. W0aB1c

Тук проблемът ми идва в използването на регулярните изрази, имам С++11 компилатор, но преди да напиша кодът, който съм написал до момента, искам само да обясня каква ми е идеята за алгоритъма:
1. Потребителят, трябва да зададе директорията и името на файла, който желае да прерови за Серийни номера
2. чрез динамично заделяне на памет, заделям 100 байта и в тях запълвам първите 100 знака от текстовия файл( fread() )
3.  сега буферът ми е готов да бъде проверен, чрез регулярните изрази
4. При намиране на регулярени изрази в тези 100 байта се отпечатват на екрана

5. буферът зарежда следващите 100 байта, но те започват от предния 95-ти. Така няма възможност заради 1 байт да изтърва сериен номер, нито да изпиша един сериен номер 2 пъти.
6. Когато стигна края на файла, свършва програмата.

До момента искам да изпорбвам програмата с първите 100 байта на файла, нарочно съм написал текстовия файл така, че да има сериен номер в тях.

Ето и сорс кода, до къде съм стигнал;
Просто не иска да търси точно този регулярен израз, и нищо не ми отпечатва.


#include <iostream>
#include <regex>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <istream>



#define path 240

int main()
{
	using namespace std::regex_constants;
	char route[path]; //пътят до файла
	char *buffer; //буфер за сравняване
	puts("Vuvedi putq i imeto na file - a");
	gets(route);
	buffer = (char*)malloc(sizeof(char) * 100); //задели 100 байта памет
	FILE * p = fopen(route, "r"); //отвори файла
	fread(buffer,1,100,p); // зареди първите 100 байта от файла
	fclose(p);

	std::cout << buffer; // проверявам дали наистина е съхранило първите 100 байта
		           
	std::cmatch m;      //ето тук вече ми е тъмна Индия

	std::regex_match(buffer, m, std::regex("[PWCN]+[a-fA-F0-9]{5}"));

	for (unsigned i = 0; i < m.size(); ++i) {
		std::cout << "match " << i << ": " << m[i];
	}
	
	system("PAUSE");
	return 0;
}

Редактирано от kalata23 (преглед на промените)

Точка 2 от условието явно е грешно зададена - това са цифри, не числа.

По въпроса за самия регулярен израз - по-скоро би трябвало да е в този вид:

 

\b[PWCN][A-f0-9]{5}\b
или

 

\b[PWCN][a-fA-F0-9]{5}\b
С плюс след първото множество изразът би открил и номер от типа "PP00000" - плюсът означава "едно или повече".

"\b" е опционално - открива граница на дума, без да включва интервал или пунктуация в резултата.

Един доста полезен сайт за бързи тестове на RegEx - http://regexr.com - ето и конкретно с примера - http://regexr.com/39r5k

За самия код не смея да се опитвам да помагам, тъй като не съм на "ти" със C++.

  • Автор

Въпросът е, че дори и регулярният израз да е верен (т.е този, който ми каза), програмата не го изпълнява. Някъде по кода имам грешка.

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.