| Autor | Zpráva | ||
|---|---|---|---|
| Darker Profil |
#1 · Zasláno: 29. 7. 2011, 20:48:34 · Upravil/a: Darker
Potřebuju si jeden soubor převést do nějakého programově čitelného formátu. Bez problému jsem se přizpůsobil způsobu zápisu, který je asi takovýto:
Nadpisy velkým písmen odělují typy hodnot. Malá (i velká) písmenka jsou sestavy hodnot. A hodnoty samotné obsahují i jíné znaky než písmenka. Vše je odděleno na řádky, takže soubor rozbíjím normálně přes str.split("\n"). No a teď ten problém. Když jsem na řádku, který obsahuje "Scale Set", chová se to nenormálně. Zde je skript, pro pochopení, co vlastně dělám: var velka=/[^A-Z]/g; //Pokud najde něco krom velkých, není to hlavní sekce
//alert(velka.test("Scale Set"));
var pismenka=/[^A-Za-z\s]/g; //pokud najde neco krom písmenek, není to sestava hnodnot (její název)
for(var i=0; i<data.length; i++){
var atual=data[i];
if(!velka.test(atual)){ //SEM SE MI PROPADNE ZMINOVANY NADPIS. Díky tomu pak celá funkce spadne
if(mainkeyword==atual)continue; //pokud jsem sem dal ||velka.test(atual) skript se pri hodnote Scale Set ukoncil
mainkeyword=atual;
output[mainkeyword]=[];
debug_alert("Item type: "+atual);
}
else if(!pismenka.test(atual)) { //skupina hodnot, sem by melo spadat i "Scale Set"
if(set==atual)continue; //to aby se mi nepremazalo uz castecne naplnene pole
set=atual;
output[mainkeyword][set]=[];//{"codes":[],"keywords":[]};
debug_alert("Set: "+atual);
}
else {
/*prace s hodnotou*/
}Naprosto mi nejde na rozum fakt, že když v prvním IF, kam by měly spadnout jen hodnoty velkým písmem dám alert(velka.test(atual)) vyskočí true. Přitom se hodnota přece nijak nemění, tak jak to tam mohlo vůbec spadnout? Další divná věc je, že soubor načítám přes jQuery z disku (ono i přepsání na JS string by bylo dost pracné) a konzole mi pro ten soubor hlásí syntax error, jako kdyby prohlížeč čekal JSON, či co. Edit: fakt, že mi tam vznikaly klíče které obsahovaly mezeru s tím neměl co do činění, ale již je opraven. |
||
| Darker Profil |
#2 · Zasláno: 29. 7. 2011, 21:10:27 · Upravil/a: Darker
Opět mezi židlí a klávesnicí, FOR končil if(i>20)break;.
Ale proč se mi to propadalo do té první možnosti nadále nechápu... EDIT: pořád to blbne, teď se to totiž, pro změnu, nepropadne nikam, a n¨ásledující hodnoty se zařadí do předchozího seznamu. Navíc to blbne i na jiných místech... EDIT2: No prosím: if(!velka.test(atual)){
if(atual=="ffff fff fff")debug("BLE!!"); //toto PROBĚHNE!!!
mainkeyword=atual;
output[mainkeyword]=[];
debug("Item type: "+atual);
}No jak je to možné? Mám ten regulár blbě? Jak se tam může propadnout něco s malými písmenky? A eště k tomu, dělá to jen ten řádek souboru nezávisle na obsahu. EDIT3: Už to vypadá nadějně. Dal jsem pryč /g z regulárů. Ale rád bych ještě věděl proč (a na jak dlouho) to pomohlo. |
||
| Witiko Profil |
#3 · Zasláno: 30. 7. 2011, 13:16:49 · Upravil/a: Witiko
Darker:
„ještě věděl proč (a na jak dlouho) to pomohlo“ Javascript není magie. Problém je pouze v tom, že nevíš, jak se regulární výrazy s flagem global chovají. Regulární výrazy mají vlastnost lastIndex která určuje místo posledního nálezu. Při použití praporku global tedy lastIndex poskakuje po jednotlivých nálezech. Nějak následovně:
var výraz = /a/g, text = "hahaha"; výraz.test(text); // true - výraz.lastIndex === 2 výraz.test(text); // true - výraz.lastIndex === 4 výraz.test(text); // true - výraz.lastIndex === 6 výraz.test(text); // false - výraz.lastIndex === 0 |
||
| peta Profil |
#4 · Zasláno: 1. 8. 2011, 16:27:25 · Upravil/a: peta
Darker:
Nerozumim, co to ma delat a nedal jsi cely script na otestovani s jednou nebo dvema hodnotami. Pripadne u nich napsat, ktere probehnou spravne a ktere ne. Z toho popisu jsem to nepochopil, jak vypada string, co jde do regularu a na jake polozky ho potrebujes rozdelit nebo jake polozky potrebujes overit, ze v nem jsou? Nadpisy velkým písmen odělují typy hodnot. //nadpisy ceho? Malá (i velká) písmenka jsou sestavy hodnot. //ale prave jsi napsal, ze velka pismena jsou oddelovace typu, tak jak muze byt velke pismeno najednou sestava? A hodnoty samotné obsahují i jíné znaky než písmenka. Vše je odděleno na řádky, takže soubor rozbíjím normálně přes str.split("\n"). Z toho jsem vyplodil nejaky takovy string? :) NADPIS1stringahoj mami, koupil jsem 3 rohliky a nekolik stringu.NADPIS2integer\n str = "Scale Set"; alert(/[^A-Z]/g.test(str)); //FF, IE vrati true, protoze jsou tam mala pismenka a mezery alert(/[^A-Za-z\\s]/g.test(str)); //FF, IE vrati true alert(/[^A-Za-z\s]/g.test(str)); //FF, IE vrati false, vypada to na bug :) alert(/[^\sA-Za-z]/g.test(str)); //FF, IE vrati false, vypada to na bug :) alert(/[^A-Za-z\s]/g.source); alert(/[^A-Za-z\\s]/g.source); str = " "; alert(/[^A-Za-z\\s]/g.test(str)); //FF, IE vrati true http://www.visibone.com/regular-expressions/ V prikladu na visibone je jasne ukazano, ze [\s] se pise s jednim lomitkem. Jenze tez je uplne dole ukazane, ze znak lomitko vyzaduje az 3 \\\. Cili nekdo chytry asi prevadi /neco/g na 'neco/g', kde uz to lomitko dvoji nutne je, protoze \ je zalomeni string radku /[^A-Za-z\s]/g = '/[^A-Za-z\s]/g' // tak ti vse za \ do konce radku zahodi var a = 'ahoj\ nazdar'; alert(a); |
||
| Witiko Profil |
#5 · Zasláno: 1. 8. 2011, 21:50:10 · Upravil/a: Witiko
peta:
K finálnímu odstavci: RegExp literála se chová jinak než textové literály, tzn.: /\n/.source === new RegExp("\\n").source, tzn. na rozdíl od řetězce escapování zpětným lomítkem není nutné.
|
||
| peta Profil |
#6 · Zasláno: 2. 8. 2011, 15:59:32 · Upravil/a: peta
Witiko:
Zkus si ten priklad, co jsem tam napsal. str = "Scale Set"; alert(/[^A-Za-z\s]/g.test(str)); //FF, IE vrati false alert(/[^A-Za-z\\s]/g.test(str)); //FF, IE vrati true To, ze podle manualu to ma fungovat s jednim lomitkem, to vim take. A ze do regexp se zapisuje string a jak se ve stringu lomitkuje :) S temi indexy to nejspis nesouvisi, ale i to je zajimave vedet. <script> var reg, str; reg = /a/g; str = "hahaha"; alert(reg.test(str)); // true - výraz.lastIndex === 2 alert(reg.test(str)); // true - výraz.lastIndex === 4 alert(reg.test(str)); // true - výraz.lastIndex === 6 alert(reg.test(str)); // false - výraz.lastIndex === 0 </script> Opravil jsem tam carku na strednik (radek1) a pripsal alerty. |
||
| Witiko Profil |
#7 · Zasláno: 2. 8. 2011, 16:48:23 · Upravil/a: Witiko
peta:
„Zkus si ten priklad, co jsem tam napsal“ Zdá se, že nechápeš, jak tebou uváděné regulární výrazy fungují. /[^A-Za-z\s]/ se bude shodovat s libovolným řetězcem, který neobsahuje velká písmena, malá písmena a znaky mezer. A jelikož "Scale Set" obsahuje pouze znaky z této sady, tak logicky navrátí test regulárního výrazu na tomto řetězci false. Opačného efektu bys dosáhl odstraněním inverzního operátoru ^. Regulární výraz /[^A-Za-z\\s]/ se pak shoduje s libovolným řetězcem neobsahujícím zpětné lomítko, malá a velká písmena a písmeno s, které už je součástí a-z a je proto nesmyslně uvedeno 2x.
„Opravil jsem tam carku na strednik (radek1) a pripsal alerty.“ Děkuji za "opravu", nicméně můj kód je zcela v pořádku. var proměnná = hodnota, proměnná2 = hodnota2, proměnná3 = hodnota3; alert je neuveden úmyslně, jelikož se předpokládá využití konzole, která provádí výpis návratových hodnot výrazů v povětšinou sofistikovanější formě než alert, který veškeré hodnoty prohání nativní / prototypálně nadřazenou toString() metodou.
Tvá snaha poučit je obdivuhodná, tvé znalosti pak méně. Občas mám obavy o začátečníky, kteří tvé příspěvky čtou. |
||
|
Časová prodleva: 3 dny
|
|||
| peta Profil |
#8 · Zasláno: 5. 8. 2011, 07:58:37 · Upravil/a: peta
A jo, mas pravdu s tou negaci :) Tak v tom pripade funguje vse spravne.
Jeste by se dalo pouzit /[^\w\s]/g /[^a-z\s]/gi |
||
|
Časová prodleva: 14 let
|
|||
0