Jak postavit výjimku pro string? – Regulární výrazy – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak postavit výjimku pro string? – Regulární výrazy – Fórum – Programujte.comJak postavit výjimku pro string? – Regulární výrazy – Fórum – Programujte.com

 

Matěj Andrle+1
Grafoman
15. 12. 2015   #1
-
0
-

Dobrý den,
utvořil jsem tokenizer pro svůj jazyk a chtěl bych podmínit ignorování mezer. V současné době - \#[^\n]+|[^\{\}\n\s]+|\{|\} - ignoruji všechny mezery. Chtěl bych však umožnit znaku " vyzobat všechny stringy i s mezerami do dalšího znaku ". "\#[^\n]+" vytahuje komentář, "[^\{\}\n\s]+" vytahuje hlavní běhové atributy bez schopnosti zpracovat víceslovné obraty a "|\{|\}" určuje level zanoření. Nikdy se mi úspěšně nedařilo sestavit "(?..." - jak na to v tomto případě? Trápí mne i jak správně zasadit podmínku do "[^\{\}\n\s]+"...

Nahlásit jako SPAM
IP: 31.30.56.–
peter
~ Anonymní uživatel
3981 příspěvků
15. 12. 2015   #2
-
0
-

Zkus ten dotaz jeste jednou a poradne.
Co ted pouzivas a jaky je vysledek? (vyraz, kod / vysledny array)
Co by to melo delat a jaky ma byt vysledek? (vyraz, kod, popis / vysledny array)

Priklad:
http://php.net/…callback.php
example #1 - to je presne, jak se to nedela :)
example #2 - source + The above example will output:, tak se to dela, takhle treba udelat krok1 a 2 do dotazu s tim, ze v kroku2 budes mit misto source-code popis.
 

//source
$text = "April fools day is 04/01/2002\n";
$text.= "Last christmas was 12/24/2001\n";
//output
April fools day is 04/01/2003
Last christmas was 12/24/2002

Popis, chci posunout rok v kazdem datumu ve formatu mm/dd/yyyy
 a neni tam zadny podobny string datumu, ktery neni datumem.

Z tveho popisu ani nevime, jaky prikaz pro reg. vyraz vlastne pouzivas.
Jestli treba nehledas bezny parser? Jestli by treba nestacilo si neco vygooglovat a nastavit tam vlastni znaky pro uvozovky a jine veci.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:7878:fb...–
Matěj Andrle+1
Grafoman
15. 12. 2015   #3
-
0
-

#2 peter
cmd {name:arg1 name:arg2 ...}

No a jméno chci víceslovné... Mohu použít: "\#[^\n]+|[^\{\}\n\s"]+|"[^"]+"|\{|\}" Jediný problém je, že mi to do stringu strčí i ty uvozovky. ("...") Proto to chci podmínit... Používám PERL-RX.

Nahlásit jako SPAM
IP: 31.30.56.–
peter
~ Anonymní uživatel
3981 příspěvků
15. 12. 2015   #4
-
0
-

   

cmd {name:arg1 name:arg2 ...}

Je to smutne, ale tam zadne uvozovky nejsou. Ale radostna zprava je, ze uz se blizis k pouzitelnemu dotazu :)

Za predpokladu

cmd {name:arg1 name:arg2 ...}
cmd {name:"arg1" name:"arg2" ...}

("[^"]*") | ([^\s]*) - nejdriv zkontrolovat uvozovkovy tvar s mezerami a pak tvar bez uvozovek
A mozna predtim jeste vylouzit ne-cislo ne-pismeno ne-uvozovku pred a za
\{[^\d\w"]*(("[^"]*")|([^\s]*))[^\d\w"]*\}
No, a jak do stringu zapisujes uvozovku "?
"\"" - s lomitkem? tak muj vyraz vysledek zmrsi
"&quote;" - prekodovavas to na entity?
Proste jsi zase nevypsal vsechny moznosti vstupniho retezce a jak ma vypadat vystup :) Zas, abych vsechno hadal...

http://www.regexp.cz/index.php
1. {[^\d\w"]*(("[^"]*")|([^\s]*))[^\d\w"]*}
2. {name:"arg1"}
4. Php preg
Na Perl mi to pise neplatny vyraz, asi tam treba jeste neco upravit.
Skoda, ze to neumi vypsat callback, seznam toho, co je v zavorkach.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:7878:fb...–
Matěj Andrle+1
Grafoman
15. 12. 2015   #5
-
0
-

#4 peter
Name = Jméno

Uvažuji, že by to bylo stejně celé v ""... ("name:value") To je ale úplně jedno! Chci jen podmínit vyhledání "[^"]+" uvozovkami na začátku a konci. Aby se tento vyhledávaný text skutečně rovnal požadovanému stringu. Pokud tam nedám ono vyčlenění na počátku a konci ("..."), pak mi to sní i závorky aj. -> když to tam dám, tak mi to do stringu hodí i uvozovky. (Jde o to, že bych takto musel zbytečně aplikovat další mechanismus.)

Nahlásit jako SPAM
IP: 31.30.56.–
peter
~ Anonymní uživatel
3981 příspěvků
16. 12. 2015   #6
-
0
-

Jasne, ale porad nevim, jak vypada vstup (treba vice druhu), a co chces z toho na vystupu. Tak potom nevim, jestli ti radim dobre nebo spatne.
"([^"]*)" - najde string, zacinajici a koncici uvozovkou, ktery nema uprostred uvozovku
"\"" - pokud by tam byl takovyto string, tak ten jednoduchy vzorec selze a vrati ("\" + ") misto (\")
* tam mam proto, ze pocitam i s prazdnym retezcem. + bych se vyhybal

Nahlásit jako SPAM
IP: 2001:718:2601:26c:109d:69...–
Matěj Andrle+1
Grafoman
16. 12. 2015   #7
-
0
-

#6 peter 

see {"ddd mezera!!! : [expr {rand()*10]" "eee   efew   fewfew : [expr {rand()*10]" "iii:[expr {rand()*10]" "oetfewt rewg eroo:[expr {rand()*10]" "ppp:[expr {rand()*10]" "uugerg erergr gergheru:[expr {rand()*10]"}

Již jsem to skoro vyřešil - "\#[^\n]+|[^\{\}\n\s"\[\]]+|"|\{|\}|\[|\]" A díky mapě funkcí pro speciální znaky "{}[]"" mi to skoro funguje. (Již řeším akoráte, aby {} potlačovaly substituce.) Tedy vyhnul jsem se RegExovému řešení. Cílem bylo vytažení tokenů... Já s prázdným řetězcem nemohl počítat - naopak by bylo dobře, kdyby to spadlo - jinak by to systém spolkl.

"\{" {
	if {$level == 0} {
		set level 1
		set open $start+1
		continue ;# otevírací závorka nepatří do argumentů
	}
	if {$level == 1 && $sub} {
		set string $start
		incr level
	}
}
"\}" {
	if {$level < 2 && $sub} {
		append result [command($cmd) [string range $input $open $end-1] args]
		set cmd {}; set args {}; set level 0
		continue ;# zavírací závorka nepatří do argumentů
	}
	if {$level == 2 && $sub} {
		set start [expr $string + 1]
		incr level -1
		incr end -1
		set string 0
	}
}
"\[" {if {$sub} {set string $start; set sub 0}; set expr $start}
"\]" {
		set output [parse [string range $input $expr+1 $end-1]]
		set input [string replace $input $expr $end $output]
		set newEnd [expr $expr + [string length $output] - 1]
		set offset [expr $offset + ($end - $newEnd)]
		
		if {$string == 0} {
			set end $newEnd
			set start $string
			set string 0
			set sub 1
		}
}
"\"" {
	if {$string == 0} {set string $start; set sub 0} {
		set start [expr $string + 1]
		set string 0
		incr end -1
		set sub 1
	}
}
Nahlásit jako SPAM
IP: 31.30.56.–
Matěj Andrle+1
Grafoman
16. 12. 2015   #8
-
0
-

   

"\{" {
	if {$level == 0} {
		set level 1
		set open $start+1
		continue ;# otevírací závorka nepatří do argumentů
	}
	if {$level == 1 && $sub} {
		set string $start
		set sub 0
		incr level
	}
}
"\}" {
	if {$level < 2 && $sub} {
		append result [command($cmd) [string range $input $open $end-1] args]
		set cmd {}; set args {}; set level 0
		continue ;# zavírací závorka nepatří do argumentů
	}
	if {$level == 2 && $expr == 0} {
		set start [expr $string + 1]
		set string 0
		set level 1
		incr end -1
	}
}
"\[" {if {$level == 1} {if {$sub} {set string $start; set sub 0}; set expr $start}}
"\]" {
		if {$level == 1} {
			set output [parse [string range $input $expr+1 $end-1]]
			set input [string replace $input $expr $end $output]
			set newEnd [expr $expr + [string length $output] - 1]
			set offset [expr $offset + ($end - $newEnd)]
			
			if {$string == 0} {
				set end $newEnd
				set start $string
				set string 0
				set sub 1
			}
		}
}
"\"" {
	if {$level > 1} {continue}

	if {$string == 0} {set string $start; set sub 0} {
		set start [expr $string + 1]
		set string 0
		incr end -1
		set sub 1
	}
}

Funguje mi to dokonale, asi to více řešit nebudu. (Ještě přidám funkci pro zpětné lomítko - escape...)

Nahlásit jako SPAM
IP: 31.30.56.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 1 host

Podobná vlákna

Jak ošetřit vyjímku... — založil marpit

Jak postavit obrovský update? — založil Matěj Andrle

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý