2016-03-21 42 views
-1

merhaba bu benim C++ regexC++ Regex Hız Optimize

regex MyRGX(R"~((\w*)\s*[(]([^;]*)[)]\s*[;])~"); 

ve bu benim dize

Data1 (

    anything1 

); 

bu regex Data1 almak ve her şeyi herhangi koşulu ile (); arasında var. ama ben Data1 gibi 50'den fazla blok var, bu regex arama hızı pcre eşdeğer regex daha düşük olacak. Sanırım sahip olduğum bu regex, hız için optimize edilmiyor. Bu koşulların hızını artıran herhangi bir öneriniz var mı ((); ve ... arasında her şey var mı?)? Bir önceki soruda şüpheli olarak

+1

Dizginiz bana bir dize gibi görünmüyor. – nwp

+0

Sadece olduğunu düşünüyorsun. – Elh48

+0

Önerilerim: Mümkün olduğunda yakalamayan grupları ('(? :)' yerine '()') kullanın. Mümkün olduğunda '+' yerine '+' kullanın ('' 'boş dizgiyle eşleştiğinden,' + 'ile karşılaştırıldığında keşfedilecek daha fazla dal vardır. Son olarak, [yapıcı] [http://en.cppreference.com/w/cpp/regex/basic_regex] [http://en.cppreference.com/w/ adresinden] kullanabilirsiniz. Daha hızlı bir yapıya (daha yavaş bir yapım maliyetine) sahip olmak için cpp/regex/basic_regex/basic_regex). regex_constants :: ECMAScript |, regex_constants :: optimize I ") +; *;) [)] \ s * [] \ * [(] ([^] s + w ~ ((\)" 'normal ifade r (R önerebilir); '. – Cornstalks

cevap

0

, bu Regex en mantıklı çözüm değildir bir vaka gibi görünüyor.

"Regex" "Düzenli Diller" açıklamak "Normal İfadeler" dan gelmektedir. Ve eşleşen parantezli diller (C++ gibi) düzenli değildir. Şimdi, "regex" dediğimiz şey, normal olmayan bazı dilleri içerecek şekilde gelişti, fakat bu optimal değil. gayet sıradan ayrıştırıcı çalışacak gibi bu durumda

görünüyor. Anladığım kadarıyla, amaç ( ve ); arasında bir şey aramaktır. ( için ); için geriye doğru basit bir metin araması yapın. Her ikisinin de bulunduğunu ve ('un );'dan önce geldiğini kontrol edin, ardından yalnızca alt dizeyi çıkarmak için bulunan dizin çiftini kullanın.

+0

Standart kütüphane fonksiyonları kullanılarak, O (N) sınırına sahip olan bir şey için uygulanabilecek bir O (N) çözümü sunun. -1 al. – MSalters