Autor Zpráva
Witiko
Profil
Co se týče Regulárních výrazů, nemám je zatím moc v krvi. Narazil jsem momentálně na jeden problém. Mám dlouhý testovací řetězec, z něhož však chci vyměnit pouze část. Nechci však zadávat do regulárního výrazu pouze danou část, protože je potřeba, aby byla daným zbytkem obalena. Je zde nějaká možnost jak zařídit, aby se testovala přítomnost výrazu celého, ale došlo k výměně pouze jeho části? Případně jak?

Ukázka:
element.style.cssText = element.style.cssText.replace(/filter:\s*progid:\s*DXImageTransform.Microsoft.Glow\(color\s*=\s*#\s*[0-9a-fA-F]*\s*,\s*strength\s*=\s*\d*\s*\)/ig,"filter:progid:DXImageTransform.Microsoft.Glow(color = " + glowColor + ", strength = " + glowStrength + " )")


Sami vidíte, že by vůbec nemuselo být nutné měnit pokaždé celý obal, jen hodnoty color a strength. Zcela jistě by to šlo vyřešit pomocí search a dvěma substringy, já však chci věřit tomu, že to lze vyřešit jedním regulárním výrazem.
Witiko
Profil
Tak už jsem myslím něco našel, za pomoci podvýrazů (pattern) bych měl být schopný dostat pomocí match dané číslice ven. Problém je v tom, že nechci jen dané texty, nýbrž jejich pozici (funkci search jsou podvýrazy šumafuk) a indexOf je nepoužitelný, protože daný řetězec se může nacházet v textu vícekrát.

Trochu mě mrzí, že druhý argument replace nelze definovat jako regulární výraz a následovně odkazovat na podvýrazy prvního vyhledávacího výrazu. Například:

"Zmrzlý lední medvěd".replace(/(Zmrzlý).*(medvěd)/,/\1 hnědý \2/) --> Zmrzlý hnědý medvěd. (Nefunguje, utopie)

Pokud už to nejde takto na jednom řádku, není alespoň možné osekat okolní text, aby se dal replacenout jen kýžený text? Je to možné udělat, pokud se text nachází za výrazem pomocí Lookaheads.

"Tohle změním a tohle tu musí být, ale nebude to v match".replace(/Tohle změním(?= a tohle tu musí být, ale nebude to v match)/,"Změněno")
--> Změněno a tohle tu musí být, ale nebude to v match

Nicméně co dělat, pokud je řetězec k výměně uprostřed textu, jako je tomu v mém případě? Podvýrazy (?:pattern) namísto (pattern) sice vyjmou podtexty z pole navráceného matchem a znemožní odkazování na podvýraz pomocí \n, nicméně jsou pořád navráceny v match a tudíš se dostávám do neřešitelné situace.

Pokud chci například změnit pomocí regulérního výrazu:

"(hodnota1 = 52, hodnota2 = 67)" na "(hodnota1 = 12, hodnota2 = 87)"

tak jsem v koncích. Jistě, můžu si celý match vzít a bez pomoci regulárních výrazů ho rozsekat, nicméně o to mi nejde. :(
Neví někdo jak na to? Pomáhám vám, když jste v koncích vy. Dneska jsem v koncích pro jednou já.
_es
Profil
Witiko:
Skús si pozrieť dokumentáciu replace pre Mozillu.

druhý argument replace nelze definovat jako regulární výraz
No v tom reťazci sa dajú použiť špeciálne znaky, alebo sa dá namiesto reťazca zadať aj funkcia.
Witiko
Profil
_es:
No v tom reťazci sa dajú použiť špeciálne znaky, alebo sa dá namiesto reťazca zadať aj funkcia.
To je rozhodně zaujímavé. Ty wildcardy jsou teda standardem? Dobré vědět!

"hodnota = 12 = hodnota".replace(/(hodnota\s=\s)\d*(\s=\shodnota)/,"$124$2")
"hodnota = 12 = hodnota" -> "hodnota = 24 = hodnota"

Co se týče té funkce, je skutečně štědrá co do předávaných argumentů, na tom by se dalo stavět, ačkoliv mě momentálně nenapadá žádný případ, kdy bych si bez funkce nevystačil - to bude tím, že jsem zatím moc regulární výrazy nepoužíval. Díky :)
_es
Profil
Witiko:
Ty wildcardy jsou teda standardem?
Áno, nájdi si v dokumentácii ECMA scriptu 3 metódu: String.prototype.replace.
Witiko
Profil
Ok, mám momentálně problém s tvorbou jednoho výrazu a říkal jsem si, že je asi hloupost tvořit kvůli tomu nové vlákno. S problémem souvisí jiný problém, na který jsem narazil a který se týká mnohonásobných podvýrazů.

"aaaa".match(/(a)*/) --> Match: "aaaa", Podvýraz 1: "a"

To však není to, o co mi jde. Jak hvězdička za závorkou naznačuje, snažím se z RegExpu dostat množinu podvýrazů, něco takového:

"aaaa".match( ??? ) --> Match: "aaaa", Podvýraz 1: "a", Podvýraz 2: "a", Podvýraz 3: "a", Podvýraz 4: "a"

Na co to potřebuji:
Snažím se jedním regulérním výrazem rozsekat číslo po tisících, tedy:

"12345678".match( ??? ) --> Match: "12345678", Podvýraz 1: "12", Podvýraz 2: "345", Podvýraz 3: "678"

Můj pokus ztroskotal ve dvou bodech, jak už jsem výše zmínil, nevím jak na vícenásobné podvýrazy a zároveň je první podvýraz, který zachytí "zbytek napravo" (počet milionů v tomto případě) žravý a nechá druhé smyčce podvýrazů jen finální trojčíslí:

"12345678".match(/(\d*)(\d{3})+/) --> Match: "12345678", Podvýraz 1: "12345", Podvýraz 2: "678"



EDIT: Začínám tušit, že tohle nejspíš nebude "oneliner".

Napsal jsem si na to neRegExpovou funkci, pořád však doufám v nějaké čistší řešení:
Number.prototype.group = function(comma, decimals) {
	var delimit = (comma == undefined) ? "," : comma,
	    size = (decimals == undefined) ? 3 : decimals,
	    temp = "", prefix = "", decimal = "", that = this + "", j = 0;

	if ( this < 0 ) {
		prefix = "-";
		that = that.slice(1);
	}

	if (that.indexOf('.') >= 0) {
		decimal = that.slice(that.indexOf('.') + 1);
		that = that.slice(0, that.indexOf('.'));
	}

	for (var i = that.length - 1; i >= 0; i--) {
		temp = that.charAt(i) + temp;
		if (((++j % size) == 0) && (i != 0))
      temp = delimit + temp;
	}

	return (prefix + temp);
}

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