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]+"...
Fórum › Regulární výrazy
Jak postavit výjimku pro string?
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.
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
""e;" - 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.
#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.)
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
#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
}
}
"\{" {
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...)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Jak ošetřit vyjímku... — založil marpit
Jak postavit obrovský update? — založil Matěj Andrle
Jak postavit graficky složitější aplikaci? — založil BDS
Jak správně postavit filtrování v PDO? — založil Matěj Andrle
Jak fungují řetězce (String) — založil Kartik
Moderátoři diskuze