Normal ifade örneği: Wiki ayrıştırıcısı

Flash Player 9 ve üstü, Adobe AIR 1.0 ve üstü

Bu basit Wiki metin dönüştürme örneğinde, birçok normal ifade kullanımı gösterilmektedir:

  • Kaynak Wiki deseniyle eşleşen metin satırlarını uygun HTML çıktı dizelerine dönüştürme.

  • URL desenlerini HTML <a> köprüsü etiketlerine dönüştürmek için normal ifade kullanma.

  • ABD doları dizelerini (örn. "$9.95" ) euro dizelerine (örn. "8.24 €" ) dönüştürmek için normal ifade kullanma.

Bu örneğin uygulama dosyalarını edinmek için bkz. www.adobe.com/go/learn_programmingAS3samples_flash_tr . WikiEditor uygulama dosyalarını Samples/WikiEditor klasöründe bulabilirsiniz. Uygulama aşağıdaki dosyaları içerir:

File

Açıklama

WikiEditor.mxml

veya

WikiEditor.fla

Flash (FLA) veya Flex (MXML) içindeki ana uygulama dosyası.

com/example/programmingas3/regExpExamples/WikiParser.as

Wiki girdi metni desenlerini eşdeğer HTML çıktısına dönüştürmek için normal ifadeleri kullanan yöntemleri içeren bir sınıf.

com/example/programmingas3/regExpExamples/URLParser.as

URL dizelerini HTML <a> köprüsü etiketlerine dönüştürmek için normal ifadeleri kullanan yöntemleri içeren bir sınıf.

com/example/programmingas3/regExpExamples/CurrencyConverter.as

ABD doları dizelerini euro dizelerine dönüştürmek için normal ifadeleri kullanan yöntemleri içeren bir sınıf.

WikiParser sınıfını tanımlama

WikiParser sınıfı, Wiki girdi metnini eşdeğer HTML çıktısına dönüştüren yöntemleri içerir. Bu çok güçlü bir Wiki dönüştürme uygulaması değildir ancak desen eşleştirme ve dize dönüştürmesi için normal ifadelerin bazı kullanımlarını gösterir.

setWikiData() yöntemiyle birlikte yapıcı işlevi yalnızca aşağıdaki gibi Wiki girdi metninin örnek bir dizesini başlatır:

public function WikiParser() 
{ 
    wikiData = setWikiData(); 
}

Kullanıcı örnek uygulamada Test Et düğmesini tıklattığında, uygulama, WikiParser nesnesinin parseWikiString() yöntemini çağırır. Bu yöntem, başka birçok yöntemi çağırır ve bu yöntemler de daha sonra sonuçta elde edilen HTML dizesini oluşturur.

public function parseWikiString(wikiString:String):String 
{ 
    var result:String = parseBold(wikiString); 
    result = parseItalic(result); 
    result = linesToParagraphs(result); 
    result = parseBullets(result); 
    return result; 
}

Çağrılan yöntemlerin her biri ( parseBold() , parseItalic() , linesToParagraphs() ve parseBullets() ), girdi Wiki metnini HTML olarak formatlanmış metne dönüştürmek üzere bir normal ifade tarafından tanımlandığı şekilde, eşleşen desenleri değiştirmek için dizenin replace() yöntemini kullanır.

Kalın ve italik desenleri dönüştürme

parseBold() yöntemi bir Wiki kalın metin desenini (örn. '''foo''' ) arar ve bu metin desenini şu şekilde HTML eşdeğerine (örn. <b>foo</b> ) dönüştürür:

private function parseBold(input:String):String 
{ 
    var pattern:RegExp = /'''(.*?)'''/g; 
    return input.replace(pattern, "<b>$1</b>"); 
}

Normal ifadenin (.?*) bölümünün, iki tanımlayıcı ''' deseni arasındaki herhangi sayıda karakterle ( * ) eşleştiğini unutmayı. Şu ? nicelik belirteci eşleşmeyi tembel durumuna getirir, bu nedenle, '''aaa''' bbb '''ccc''' gibi bir dize için eşleşen birinci dize '''aaa''' olup dizenin tamamı olmaz ( ''' deseniyle başlayıp sona eren).

Normal ifadedeki parantezler bir yakalama grubunu ifade eder ve replace() yöntemi, yerini alan dizede $1 kodunu kullanarak bu gruba başvurur. Normal ifadedeki g ( global ) bayrağı, replace() yönteminin dizedeki tüm eşleşmeleri (yalnızca birinciyi değil) değiştirmesini sağlar.

parseItalic() yöntemi parseBold() yöntemine benzer şekilde çalışır, tek farkı, italik metin sınırlayıcısı olarak iki kesme işaretini ( '' ) (üç değil) kontrol etmesidir:

private function parseItalic(input:String):String 
{ 
    var pattern:RegExp = /''(.*?)''/g; 
    return input.replace(pattern, "<i>$1</i>"); 
}

Madde imi desenlerini dönüştürme

Aşağıdaki örnekte gösterildiği gibi, parseBullet() yöntemi, bir Wiki madde imi satır desenini (örn. * foo ) arar ve bunu HTML eşdeğerine (örn. <li>foo</li> ) dönüştürür:

private function parseBullets(input:String):String 
{ 
    var pattern:RegExp = /^\*(.*)/gm; 
    return input.replace(pattern, "<li>$1</li>"); 
}

Normal ifadenin başındaki ^ sembolü, satırın başıyla eşleşir. Normal ifadedeki m ( multiline ) bayrağı, normal ifadenin ^ sembolünü yalnızca dizenin başıyla değil, satırın başıyla da eşleştirmesini sağlar.

\* deseni, bir yıldız karakteriyle eşleşir. ( * nicelik belirteci yerine değişmez yıldızı işaret etmek için ters eğik çizgi kullanılmıştır.)

Normal ifadedeki parantezler bir yakalama grubunu tanımlar ve replace() yöntemi, yerini alan dizede $1 kodunu kullanarak bu gruba başvurur. Normal ifadedeki g ( global ) bayrağı, replace() yönteminin dizedeki tüm eşleşmeleri (yalnızca birinciyi değil) değiştirmesini sağlar.

Paragraf Wiki desenlerini dönüştürme

linesToParagraphs() yöntemi, girdi Wiki dizesindeki her satırı bir HTML <p> paragraf etiketine dönüştürür. Yöntemdeki bu satırlar, girdi Wiki dizesinden boş satırları çıkarır:

var pattern:RegExp = /^$/gm; 
var result:String = input.replace(pattern, "");

Normal ifadenin, satırın başını ve sonunu eşleştirdiği ^ ve $ sembolleri. Normal ifadedeki m ( multiline ) bayrağı, normal ifadenin ^ sembolünü yalnızca dizenin başıyla değil satırın başıyla da eşleştirmesini sağlar.

replace() yöntemi, eşleşen tüm alt dizelerin yerine (boş satırlar) boş bir dize ( "" ) getirir. Normal ifadedeki g ( global ) bayrağı, replace() yönteminin dizedeki tüm eşleşmeleri (yalnızca birinciyi değil) değiştirmesini sağlar.

URL'leri HTML <a> etiketlerine dönüştürme

Kullanıcı, urlToATag onay kutusunu seçmişse, örnek uygulamada Test Et düğmesini tıklattığında, uygulama, URL dizelerini girdi Wiki dizesinden HTML <a> etiketlerine dönüştürmek için URLParser.urlToATag() statik yöntemini çağırır

var protocol:String = "((?:http|ftp)://)"; 
var urlPart:String = "([a-z0-9_-]+\.[a-z0-9_-]+)"; 
var optionalUrlPart:String = "(\.[a-z0-9_-]*)"; 
var urlPattern:RegExp = new RegExp(protocol + urlPart + optionalUrlPart, "ig"); 
var result:String = input.replace(urlPattern, "<a href='$1$2$3'><u>$1$2$3</u></a>");

RegExp() yapıcı işlevi, çok sayıda bileşenden tek bir normal ifade ( urlPattern ) oluşturmak için kullanılır. Bu bileşenlerin her biri, normal ifade deseninin parçasını tanımlayan dizelerdir.

protocol dizesi tarafından tanımlanan normal ifade deseninin birinci bölümü, http:// veya ftp:// olmak üzere bir URL protokolünü tanımlar. Parantezler, ? sembolüyle belirtilen, yakalama yapmayan bir grubu tanımlar. Başka bir deyişle, parantezler yalnızca | değiştirme desenine yönelik bir grubu tanımlamak için kullanılır; bu grup, replace() yönteminin yerini alan dizesinde geribaşvuru kodlarıyla ( $1 , $2 , $3 ) eşleşmez.

Normal ifadeyi oluşturan diğer bileşenlerin her biri, daha sonra replace() yönteminin yerini alan dizesindeki geribaşvuru kodlarında ( $1 , $2 , $3 ) kullanılan yakalama gruplarını (desende parantezlerle belirtilir) kullanır.

Desenin, urlPart dizesi tarafından tanımlanan bölümü, şu karakterlerden en az biriyle eşleşir: a-z , 0-9 , _ veya - . + nicelik belirteci, en az bir karakterin eşleştiğini belirtir. Şu \. öğesi, zorunlu bir nokta ( . ) karakterini belirtir. Ve geri kalan kısım da bu karakterlerden en az birini içeren bir dizeyle eşleşir: a-z , 0-9 , _ veya - .

Desenin, optionalUrlPart dizesiyle tanımlanan bölümü, şunlardan hiçbiriyle veya bir ya da birkaç tanesiyle eşleşir: nokta ( . ) karakteri ve onu takip eden herhangi bir sayıda alfasayısal karakter ( _ ve - dahil). * nicelik belirteci, bu karakterlerden hiçbirinin eşleşmediğini veya bir ya da birkaçının eşleştiğini belirtir.

replace() yöntemine yapılan çağrı, normal ifadeyi kullanır ve geribaşvuruları kullanarak, yerini alan HTML dizesini oluşturur.

Daha sonra urlToATag() yöntemi, e-posta desenlerini, HTML <a> köprü dizeleriyle değiştirme tekniğine benzer teknikler kullanan emailToATag() yöntemini çağırır. Bu örnek dosyada HTTP, FTP ve e-posta URL'leriyle eşleşme yapmak için kullanılan normal ifadeler, örneklendirme amacıyla nispeten basit tutulmuştur; bu URL'lerin daha doğru şekilde eşleştirilmesi için daha karmaşık normal ifadeler vardır.

ABD doları dizelerini euro dizelerine dönüştürme

Kullanıcı dollarToEuro onay kutusunu seçmişse, örnek uygulamadaki Test Et düğmesini tıklattığında, aşağıdaki gibi uygulama, ABD doları dizelerini (örn. "$9.95" ) euro dizelerine (örn. "8.24 €" ) dönüştürmek için, CurrencyConverter.usdToEuro() statik yöntemini çağırır:

var usdPrice:RegExp = /\$([\d,]+.\d+)+/g; 
return input.replace(usdPrice, usdStrToEuroStr); 

Birinci satır, ABD doları dizelerinin eşleşmesi için basit bir deseni tanımlar. $ karakterinin önüne ters eğik çizgi ( \ ) kaçış karakterinin getirildiğine dikkat edin.

replace() yöntemi, desen eşleştirici olarak normal ifadeyi kullanır ve yerini alacak dizeyi (euro cinsinden bir değer) belirlemek için usdStrToEuroStr() işlevini çağırır.

replace() yönteminin ikinci parametresi olarak bir işlev adı kullanıldığında, çağrılan işleve parametre olarak şunlar iletilir:

  • Dizenin eşleşen bölümü.

  • Herhangi bir yakalanmış parantez grubu eşleşmesi. Bu şekilde iletilen argüman sayısı, yakalanan parantez grubu eşleşmelerinin sayısına bağlı olarak değişiklik gösterir. İşlev kodu içinde arguments.length - 3 öğesini kontrol ederek, yakalanmış parantez grubu eşleşmelerinin sayısını belirleyebilirsiniz.

  • Eşlemenin başladığı dize içindeki dizin konumu.

  • Tam dize.

usdStrToEuroStr() yöntemi şu şekilde ABD doları dize desenlerini euro dizelerine dönüştürür:

private function usdToEuro(...args):String 
{ 
    var usd:String = args[1]; 
    usd = usd.replace(",", ""); 
    var exchangeRate:Number = 0.828017; 
    var euro:Number = Number(usd) * exchangeRate; 
    trace(usd, Number(usd), euro); 
    const euroSymbol:String = String.fromCharCode(8364); // € 
    return euro.toFixed(2) + " " + euroSymbol;  
}

args[1] öğesinin, usdPrice normal ifadesinin eşleştiği yakalanmış parantez grubunu temsil ettiğini unutmayın. Bu, ABD doları dizesinin sayısal bölümüdür: başka bir deyişle, $ işareti olmadan dolar miktarıdır. Bu yöntem, döviz kuru dönüştürmesi uygular ve bir sonuç dizesi (başında $ sembolü yerine, sonunda € sembolü bulunan) döndürür.