2015-05-19 20 views
6

Merhaba Çözemediğim normal ifadelerle ilgili bir sorunla karşılaştım.Sorguyu belirten bir javascript normal ifadesi

I sorgusu (parçaya bölünmüş sorgu), bir örnek olarak, aşağıdaki bir varsayalım tokenize gerekir:

These are the separate query elements "These are compound composite terms" 

Sonunda 7 jeton bir dizi için olan gerekir:

1) These 
2) are 
3) the 
4) separate 
5) query 
6) elements 
7) These are compound composite term 

Yedinci simge birkaç sözcükten oluşur çünkü çift tırnak işaretleri içerisindeydi.

Soruma şudur: Giriş dizesini tek düzenli ifade kullanarak yukarıdaki açıklamalara uygun olarak belirtmek mümkün mü?

Düzenleme

aynı şeyi elde ederken Regex.exec veya benzer bir kod yerine split kullanma imkanı merak, bu yüzden another question here izledi bazı araştırma yaptı ettik. Ve böylece bir soruya başka bir cevap olarak bir aşağıdaki regex kullanılabilir: Aşağıdaki one-liner kullanım senaryosu ile

(?:")(?:\w+\W*)+(?:")|\w+ 

:

var tokens = query.match(/(?:")(?:\w+\W*)+(?:")|\w+/g); 

yararlı olması dileğiyle ...

cevap

5

Bu normal ifadeler kullanabilirsiniz: o tırnak bile numara boşluğundan sonra olmadığından emin olmak için bir lookahead kullanarak dış çift tırnak ise

var s = 'These are the separate query elements "These are compound composite term"'; 

var arr = s.split(/(?=(?:(?:[^"]*"){2})*[^"]*$)\s+/g); 
//=> ["These", "are", "the", "separate", "query", "elements", ""These are compound composite term""] 

Bu regex boşluk bölünmüş olacaktır.

+1

Oh, yerine dize ... – Lu4

+0

bölme değerlerini sorgulamak çalışıyordu Ancak bu durumda, sen ' "Bunlar bileşik kompozit sürelidir"' çift tırnak var. Alıntıya ihtiyacın olmadığını düşündüm. –

+1

Ayrıca işe yarayacak, ana nokta performans – Lu4

2

Daha sonra dize bölmek ve çift tırnak içine alt dizeleri kapmak ve daha basit bir yaklaşımı kullanabilirsiniz clean fonksiyonu ile boş dizi öğeleri kurtulmak:

Array.prototype.clean = function() { 
 
    for (var i = 0; i < this.length; i++) { 
 
    if (this[i] == undefined || this[i] == '') {   
 
     this.splice(i, 1); 
 
     i--; 
 
    } 
 
    } 
 
    return this; 
 
}; 
 

 
var re = /"(.*?)"|\s/g; 
 
var str = 'These are the separate query elements "These are compound composite term"'; 
 
var arr = str.split(re); 
 
alert(arr.clean());

2

Sen edebilirsiniz Bir alıntı ve bir sonraki \S+ veya boşluk olmayan her şey olan her şeyi alın \S+:

var re = /".*?"|\S+/g, 
 
    str = 'These are the separate query elements "These are compound composite term"', 
 
    m, 
 
    arr = []; 
 

 
while (m = re.exec(str)){ 
 
    arr.push(m[0]); 
 
} 
 
alert(arr.join('\n'));

İlgili konular