Regulerní výrazy

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
PetrB
Příspěvky: 141
Registrován: 20 čer 2018, 13:39
Reputation: 0

Regulerní výrazy

Příspěvek od PetrB » 18 čer 2020, 01:13

Ahoj,
máte někdo zkušenosti s jejich použítím pod Arduinem?

Jde o to, že mám řádek který vypadá třeba takto:
GET /Test?parametr=1 HTTP/1.1
GET /Test HTTP/1.1
GET /Test?parametr=1#Zde HTTP/1.1
GET /Test?parametr1=1&parametr2=2#Zde HTTP/1.1

a já z toho chci vybrat Test případně parametr=... a Zde.
Vyrobil jsem si tento výraz: ^(?:GET\s+\/)(?'stranka'.*?)(?:\?(?'parametry'.*?)){0,1}(?:#(?'kapitola'.*?))*(?:\s+HTTP\/.*)$ (viz. https://regex101.com/r/2LwCkx/1)ale knihovna Regexp.h mi vrací stále nula nalezeno.

Zkouším tento kód, který jsem opsal z nějakého tutorialu.

Kód: Vybrat vše

String rozeberRadek(String vRadek, String &vParametry, String &vKapitola) {
	MatchState ms;
	char buf[100];
	char buf2[100];
/**/
	vRadek.toCharArray(buf2,100);
	Serial.println(buf2);
	ms.Target(buf2);
	//Původní výraz "^(?:GET\s+\/)(?'stranka'.*?)(?:\?(?'parametry'.*?)){0,1}(?:#(?'kapitola'.*?))*(?:\s+HTTP\/.*)$"
	unsigned int count = ms.MatchCount("^(?:GET\s+\/)(.*?)(?:\?(.*?)){0,1}(?:#(.*?))*(?:\s+HTTP\/.*)$");
	Serial.print("Found ");
	Serial.print(count);
	Serial.println(" matches.");
	for (int j = 0; j < count; j++)
	{
		Serial.print("Capture number: ");
		Serial.println(j, DEC);
		Serial.print("Text: '");
		Serial.print(ms.GetCapture(buf, j));
		Serial.println("'");
	}
}
	
Nevíte co s tím? Samozřejmě bych to mohl "rozparcelovat" klasicky přes IndexOf a pod. ale takhle mi to přijde elegantnější.

Díky

Pb

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Regulerní výrazy

Příspěvek od KamilV » 18 čer 2020, 08:27

Nejelegantnější je používat metody, které knihovny nabízejí.
RegExp je zde zbytečný, IndexOf pak totálně...

Kód: Vybrat vše

#include <ESP8266WebServer.h>
ESP8266WebServer server(80);
void setup() {
  server.begin();
  server.on("/Test", handleTest);
}

void loop() {
  server.handleClient();
}

void handleTest() {
  String parametr = server.arg("parametr");
  String parametr1 = server.arg("parametr1");
  String parametr2 = server.arg("parametr2");
}
#Zde se na server neodesílá, to je záležitost na straně klienta.

PetrB
Příspěvky: 141
Registrován: 20 čer 2018, 13:39
Reputation: 0

Re: Regulerní výrazy

Příspěvek od PetrB » 18 čer 2020, 09:24

Díky,
to jsem hledal! Tedy teď si vzpomínám, že už jsem to někde viděl, ale nějak se mi to vykouřilo z hlavy, tak jsem automaticky sáhnul po těch reg. výrazech.

Pb

PetrB
Příspěvky: 141
Registrován: 20 čer 2018, 13:39
Reputation: 0

Re: Regulerní výrazy

Příspěvek od PetrB » 18 čer 2020, 12:48

Tak bohužel ne. Nepoužívám knihovnu ESPServer ;-(.

každopádně mi nefunguje ani jednoduché

Kód: Vybrat vše

 unsigned int count = ms.MatchCount("GET\s+\/");
na vstupní text
GET /Test?parametr=1 HTTP/1.1

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Regulerní výrazy

Příspěvek od KamilV » 18 čer 2020, 18:20

Na čem to provozuješ a jakou knihovnu tedy používáš?

PetrB
Příspěvky: 141
Registrován: 20 čer 2018, 13:39
Reputation: 0

Re: Regulerní výrazy

Příspěvek od PetrB » 19 čer 2020, 00:11

Mám Arduino Mega 2560, přesně nevím jaký je to Ethernet Shield (je s SD kartou a s nápisem HanRun HRB11105A).
Pro ethernet používám knihovnu Ethernet.h a SPI.h a pro regulerní výrazy jsem našel starou knihovnu (tuším z roku 2011) Regexp.h (viz https://forum.arduino.cc/index.php?topic=59917.0), která funguje podle LUA specifikace, ale nezdá se mi moc funkční. Trošku složitější výraz jsem tam nebyl schopný zprovoznit. Tak jsem to opustil a teď si píšu vlastní objekt, který to rozhází na jednotlivé komponenty.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 17 hostů