Regularni izraz koji pronalazi tipfeler?

Pozdrav,

htio bih napraviti funkciju koja će detektirati tip felere.
Volio bih se čim više osloniti na regexp, no po potrebi djelomično mogu rješiti stvar i if, else logikom.

Algoritam bi trebao razmišljati na sljedeći način, recimo imamo tekst:

“Danas je lijep sunčan dan”

Koji može biti napisan tipa:
“Danas je lijep sučan dan”
“Danas je lijep sučnan dan”
“Danas je lijep sumčan dan”

Znači, pretpostavka je da tip feler ili guta jedno slovo, ili zamjenjuje dva susjedna slova, ili krivo piše jedno slovo.
S time da bi volio imati varijantu regularnog izraza koja traži da prvo i zadnje slovo moraju biti točno napisana, i varijanta koja bi trpila da je i prvo ili zadnje slovo ispušteno, flipano ili krivo napisano.

Puno hvala na bilo kakvoj pomoći.
Ne trebam dobiti gotov izraz/e, značilo bi mi i da dobijem nekakve hintove.

Svjestan si da moraš imati listu svih mogućih riječi?

Pogledaj Typo.js repo, pročitaj dokumentaciju i onda vidi kako su implementirali npr check funkciju.

Nebitna je lista svih riječi…jer trebam samo određene riječi testirati na tipfeler. A te riječi koje trebam testirati, tu listu i imam.

…budem bacio pogled na taj typo.js :wink:

Našao sam ovako jedan komentar unutar te check funkcije:

	// Build the full regular expressions for each compound rule.
	// I have a feeling (but no confirmation yet) that this method of 
	// testing for compound words is probably slow.

hehe,
čini mi se da je lik isto svoja pravila rješava sa if else logikom, te da je svjestan da bi moglo brže s regularnima. Osim komentara, nisam primjetio nešto regularnih…

Ja bi volio da ako netko ima ikakvu ideju kako bi se pojedini djelovi mog upita rješili sa regularnim, da probamo. Pa da putem nešto i naučimo :slight_smile:

Možemo gornji upit razbiti na tri spomenuta pravila…i dodati četvrto koje zaboravih:

1.pravilo: "nedostajuće slovo"
2.pravilo: "flipana slova"
3.pravilo: "krivo slovo"
4.pravilo: “višak slovo” ->to bi bila rečenica: “Danas je lijep sunčaln”

Eto, ja ću nabadati ovdje s regularnim “pokušajevima” za pojedino pravilo, a ako itko osjeti da mi može dati dobar hint na što da se osvrnem…i s čim bi mogao kvalitetnije pristupiti rješavanju problema, neka sugestira!

(neka promatrana riječ bude “dan”)
-nedostajuće slovo:

 (an|dn|da)

-flipano slovo:

//...no idea for now :) 

-krivo slovo:

(\wan|d\wn|da\w)

-visak slovo:

(\wdan|d\wan|da\wn|dan\w)

Vjerujem da se to može puno elegantnije :smiley:

Mozda ne prevec elegantno, ali work like charm :smile:

//example: string=replaceTipFeler('beograd+(a|u)?',string,{block:'biograd(a|u)?',onZamjena:function(zamjena,match){}});

function replaceTipFeler(word,string,f)
	{

	if(!f)var f={};
	var globalReplace='g';
	var caseSensitive='i';
	if(isset(f.caseSensitive)) caseSensitive= f.caseSensitive ? '':'i';

	var data=word.split('+');
	word=data[0];
	var sufix=data.length>1 ? data[1] : '';

	var replacer=function(match, offset) 
		{
		if(f.block)  //block je regularni izraz upit koji se uspoređuje sa pronađeim tipfelerom. Ako block odgovara tipfeleru, zamjena će biti blokirana!
			{
			var patt2=new RegExp(f.block,'gi');
			var blockedZamjena=match.match(patt2);
			if(blockedZamjena && blockedZamjena[0].length==match.length)return match;
			}
		if(sufix)  //recimo zadan word je: "beograd+(a|u)?" , ova kontrola sprijecava da se napravi zamjena beograda->beograd 
			{
			var patt2=new RegExp(word+sufix,'gi');
			var blockedZamjena=match.match(patt2);
			if(blockedZamjena && blockedZamjena[0].length==match.length)return match;
			}	

		if(match==word)return word;
		if(f.onZamjena)f.onZamjena(word,match);
		return word;
		}

	var search=function(patern,rule)
		{
		var patt=new RegExp("\\b("+patern+")"+sufix+"\\b",globalReplace+caseSensitive);	
		string=string.replace(patt, replacer);
		}


	//1.nedostajuce slovo:  (d?an|da?n|dan?)
	var patern=[];
	for(var x=0;x<word.length;x++)patern.push(word.substring(0,x)+word.substring(x+1));
	search(patern.join('|'),'nedostajuce slovo');


	//2.krivo slovo: (\wan|d\wn|da\w)
	var patern=[];
	for(var x=0;x<word.length;x++)patern.push(word.substring(0,x)+'\\w'+word.substring(x+1));
	search(patern.join('|'),'krivo slovo');


	//3. visak slovo: (d\wan|da\wn)
	var patern=[];
	for(var x=0;x<word.length-1;x++)patern.push(word.substring(0,x+1)+'\\w'+word.substring(x+1));
	search(patern.join('|'),'visak slovo');
	
	//4. fliped slova
	var patern=[];
	for(var x=0;x<word.length-2;x++)patern.push(word.substring(0,x+1)+word.charAt(x+2)+word.charAt(x+1)+word.substring(x+3));
	search(patern.join('|'),'fliped');

	return string;
	}
1 Like