Skocz do zawartości


[RegExp] Wyszukiwanie zmiennych tekstowych


2 odpowiedzi w tym temacie

#1 dj.drezyna

    Pomocna dłoń

  • Super użytkownicy
  • 154 Postów:

Napisano nie, 29 kwi 2012 - 12:34

Witam!

Chciałbym wyszukiwać zmienne tekstowe w kodzie np. JavaScript, a nie jestem w stanie wymyślić do tego sposobu. Myślałem o pętli przechodzącej przez wszystkie linie i znaki danej linii ale nie jest to metoda idealna o czym dalej. Natomiast zupełnie nie mam pomysłu na jakąś formułę w RegExp, bo tutaj to nie działałoby w ogóle, bo np: /\'\.'/g zupełnie nie jest właściwe, ponieważ przy czymś takim jak: 'jestem Hand\'ym' nie działa.

A co do sposobu pętli jest okej:

var wynik = '';
var typ;
var i = 0;
var linie = document.getElementById('tekst').value.split("\n");
for (var linia=0;linia<linie.length;linia++) {
linie[linia] = ' '+linie[linia]+' ';//nowa linia
wynik += "\n"+linia+':';
var jeden = linie[linia].indexOf('\'');
var dwa = linie[linia].indexOf('\"');
if (((jeden < dwa) && (jeden > -1) && (dwa > -1)) || ((jeden > -1) && (dwa == -1)))
typ = 'jeden';
else
typ = 'dwa';//alert(jeden+' '+dwa);
for (var znak=0;znak<linie[linia].length;znak++) {
if ((typ == 'jeden') || (typ == '')) {
if ((linie[linia][znak] == '\'') && ((linie[linia][znak-1] != '\\') || (linie[linia][znak+1] == '\''))) {
i++;
typ = 'jeden';
wynik += znak+',';
if (i == 2) {
typ = '';
i = 0;
}
}
}
if ((typ == 'dwa') || (typ == '')) {
if ((linie[linia][znak] == '\"') && ((linie[linia][znak-1] != '\\') || (linie[linia][znak+1] == '\"'))) {
i++;
typ = 'dwa';
wynik += znak+',';
if (i == 2) {
typ = '';
i = 0;
}
}
}
}
}
alert(wynik);

ale nie zupełnie niestety, bo zapis:
var ok = ''; nie wywoła błędu ale poprawny ze względu na składnię js zapis:
var a = '\\'; //wpisane: \
lub
var b = 'jestem sobie tekst \\'; //wpisane: jestem sobie tekst \
lub
var c = 'jestem sobie tekst \\', a może nie\\'; // wpisane: jestem sobie tekst ', a może nie\
spowoduje zapis jedynie pierwszego apostrofu, a drugi zostanie pominięty, bo znak \' nie zamyka instrukcji, a tu jednak tak. I w tym momencie nie wiem jak sobie poradzić.
Coś mi podpowiada mimo to, że najlepiej do tego nadałoby się jednak wyrażenie regularnie ale nie jestem w stanie go napisać.

Bardzo dziękuję za czas poświęcony na zapoznanie się z postem,
pozdrawiam,
Marek

#2 dj.drezyna

    Pomocna dłoń

  • Super użytkownicy
  • 154 Postów:

Napisano wto, 01 maj 2012 - 13:20

Znalazłem coś takiego w internecie:
/'[^'\\]*(?:\\.[^'\\]*)*'/
Działa ale marzy mi się zrozumienie jak działa te wyrażenie. Mógłby ktoś opisać co za co jest odpowiedzialne, bo ja np. nie rozumiem jak może znależć ciąg 'abc\'e' prawidłowo (a znajduje) bo przecież jest zaprzeczenie w postaci: [^'\\]

Bardzo byłbym wdzięczny.

#3 dj.drezyna

    Pomocna dłoń

  • Super użytkownicy
  • 154 Postów:

Napisano śro, 12 wrz 2012 - 16:47

Na początku znajduje apostorf, potem szuka znaków innych niż odwrotny ukośnik lub innych niż apostrof. (apostrof kończy łańcuch o ile nie jest poprzedzony znakiem uniku odwróconego ukośnika). Wyszukuje też wyrażeń uniku w postaci odwrotnego ukośnika i dowolnego znaku i jeśli jest - innego lub więcej znaków rożnych od znaku apostrofu lub znaku odwróconego ukośnika.