Autor Zpráva
Gray blogger
Profil *
Mohl by mi tu někdo pomoct? Nevím jak to udělat, JS mi moc nejde.
Mám jednu aplikaci, která rozparsuje text na slova (mezera je použitá na rozparsování). Jenže co potřebuju udělat je toto: když dám text do složených závorek, tak celé to musí být naparsováno jako jeden element.

Např.
{3.9. pondělí:} Nějaká věta se slovy. {4.9. úterý:} Další věta na rozparsování.

Elementy by měly být rozparsovány takto:
0 => "{3.9. pondělí:}",
1 => "Nějaká",
2 => "věta",
3 => "se",
4 => "slovy.",
5 => "{4.9. úterý:}",
6 => "Další",
7 => "věta",
8 => "na",
9 => "Rozparsování."
Keeehi
Profil
Můžou být složené závorky uvnitř složených závorek? A může se stát, že bude potřeba složená závorka i jako obyčejný znak v textu?
Gray blogger
Profil *
Ne. Uvnitř složených závorek jsou povolené znaky bez závorek. A mimo závorky být závorky nemůžou, protože ty závoroky jsou vyhrazené právě na to, aby oddělili ten text v závorce od ostatního textu.
Keeehi
Profil
Pak je to celkem jednoduché
var data = "{3.9. pondělí:} Nějaká věta se slovy. {4.9. úterý:} Další věta na rozparsování.";

var matches = data.matchAll(/\{[^{]*\}|[^ ]+/g)

for (var match of matches) {
  console.log(`Found ${match[0]} start=${match.index} end=${match.index + match[0].length}.`);
}
Gray blogger
Profil *
Keeehi:
Díky moc. Jsem překvapen že je to tak jednoduché! Ale jak to mám dostat do toho prototypu. Cílem mého pokusu je, aby se mi vypsalo pole:
String.prototype.splitMe = function (char) {
    var data = "{3.9. pondělí:} Nějaká věta se slovy. {4.9. úterý:} Další věta na rozparsování."; 
    var matches = data.matchAll(/\{[^{]*\}|[^ ]+/g)
    return matches;
};
var test = "pokus";
console.log(test.splitMe);
V konzole vidím tento výpis:
function String.prototype.splitMe()
Kajman
Profil
String.prototype.splitMe = function () {
    return this.match(/\{[^{]*\}|[^ ]+/g);
};
var test = "{3.9. pondělí:} Nějaká věta se slovy. {4.9. úterý:} Další věta na rozparsování.";
console.log(test.splitMe());
Gray blogger
Profil *
Díky :)


Mohu tě ještě o něco požádat? Alespoň o radu. Aplikace, kterou se snažím trochu upravit převádí hebrejské znaky na českou výslovnost. Mají tam takovou funkci, která nejdříve rozparsuje text takto:

return text.split(splits)
výsledek:
Array [ "{31}", " ", "נֵּ", "ה", " ", "יָ", "מִ", "י", "ם", 275 dalších… 275 ]transliterate.js:91:5
To první číslo je v závorce. Původní text sem asi nevložím, ale začínáto tím "{31} " a pak je hebrejština.

Ten jejich kód pak pokračuje funkcí map uvnitř které se zpracovávají jednotlivé elementy (e) toho pole. Pak se to asi dělí na jednotlivá písmena. Co ale nechápu proč tam je ta funkce sort. Uvažuju nad tím jak tuto funkci modifikovat. Jde o to, že ve výsledku to odstraní ty čísla, která já odstranit nechci. Nápad, který jsem teď dostal, napsat si vlastní funkci pro ten druhý split(""), aby nedošlo ke splitování toho textu se závorkou. Vlastně ale budu muset napsat i vlastní prototyp na ten sort asi - aby nedošlo k té změně na řetězci {31} , {32} atd.

V současnosti ten druhý split dělá toto:
Array [ "{", "3", "1", "}" ]transliterate.js:100:11
Array [ " " ]transliterate.js:100:11
Array [ "ה", "ִ" ]transliterate.js:100:11
Array [ "נ", "ּ", "ֵ" ]transliterate.js:100:11
Array [ "ה" ]transliterate.js:100:11
Array [ " " ]transliterate.js:100:11
Array [ "י", "ָ" ]transliterate.js:100:11
Array [ "מ", "ִ" ]transliterate.js:100:11
Array [ "י" ]

Po úpravě:
String.prototype.splitSecond = function () {
    if (CharAt(0)='{' ) 
      return [this]
    else
      return this.split('');
};

console.log(e.splitFirst());
Vypisuje:
          Array [ "{31}" ]transliterate.js:99:12
nulltransliterate.js:99:12
Array [ "הִ" ]transliterate.js:99:12
Array [ "נֵּ" ]transliterate.js:99:12
Array [ "ה" ]transliterate.js:99:12
nulltransliterate.js:99:12
Array [ "יָ" ]transliterate.js:99:12
Array [ "מִ" ]transliterate.js:99:12
Array [ "י" ]transliterate.js:99:12
Array [ "ם" ]transliterate.js:99:12
null

Tedy místo mezery vrací null. Jak opravit toto? A pak bych potřeboval napsat vlastní prototyp na sort.


Jo a zapoměl jsem vložit ten kód

    return text.split(splits).map(e => {
           console.log(e.splitFirst());
          return e.split('').sort((a,b) => {
            // since the str is split at consonants, the first a is always const, thus never flip
             if(consonants.test(a) ) {return 0}
             // if a is anything except a consonant and b is a ligature, then flip
             if(!consonants.test(a) && ligature.test(b)){return 1}
             if(vowels.test(a) && dagesh.test(b)) {return 1}
             if(accents.test(a) && dagesh.test(b)) {return 1}
        }).join('')
      }).join('')
Gray blogger
Profil *
Našel jsem dvě chyby. Funkce se jmenuje splitSecond ne splitFirst.

String.prototype.splitSecond = function () {
    if (this.charAt(0)=='{' )
      return [this]
    else
      return this.split('');
};

Nicméně proč mi return [this] nevrací ten string (dovnitř pole)? this je objekt.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0