2009-05-11 12 views
5

Tüm & öğelerini bir HTML öğesinin parçası olmayan bir Dizede değiştirmeniz gerekir. Dize "Bu & entites > & <" dönecektir BöyleceRegex optimizasyonu - java'daki çıkış işaretlerinden kaçış

Ve bu regex-desenli geldim "> & < Bu & entites": "& [a-z-0-9] {2 , 7}; "iyi çalışıyor. Ama ben normal ifadede çok yetenekli değilim ve 100k yineleme üzerinde hızı test ettiğimde, regex kullanmayan bir önceki kullanılan yönteme göre çift kez kullanır. (Ama% 100 çalışan werent).

deneme kodunda:

long time = System.currentTimeMillis(); 
String reg = "&(?!&#?[a-zA-Z0-9]{2,7};)"; 
String s="a regex test 1 & 2 1&2 and &_gt; - &_lt;" 
for (int i = 0; i < 100000; i++) {test=s.replaceAll(reg, "&amp;");} 
System.out.println("Finished in:" + (System.currentTimeMillis() - time) + " milliseconds"); 

Yani soru optimize bazı bariz yolları daha etkili olabilmesi için bu regex ifadesi olup olmadığını olurdu?

+0

Ben gibi çizgi ile &_gt; entites yazmak zorunda aksi takdirde kod içindi sembolü olarak göstermek istiyorum. – Duveit

+0

Neredeyse dört kişimiz, kod biçiminde tırnak işaretleri içeren ve işaretleri çevrelemek için metninizi düzenlemeye çalıştık. Sadece istediğiniz metni seçin ve kodu kullanın, bu işareti ve işareti koruyacaktır. – cgp

cevap

6

s.replaceAll(reg, "&amp;"). Kalıbı bir kez derlemek, performansta bir miktar artış sağlayacaktır (bu durumda ~% 30).

long time = System.currentTimeMillis(); 
String reg = "&(?!&#?[a-zA-Z0-9]{2,7};)"; 
Pattern p = Pattern.compile(reg); 
String s="a regex test 1 & 2 1&2 and &_gt; - &_lt;"; 
for (int i = 0; i < 100000; i++) { 
    String test = p.matcher(s).replaceAll("&amp;"); 
} 
System.out.println("Finished in:" + 
      (System.currentTimeMillis() - time) + " milliseconds"); 
+0

Bu doğru, 550 ms'den 450 ms'ye indi. Önceden tanımlı deseni uygulayıp uygulayamayacağımızı göreceğim. – Duveit

0

Java regex sınıflarına çok aşina değilim, ancak genel olarak, bir sıfır genişlikli arama nesnesini araştırmak isteyebilirsiniz; ve işareti sonra. Bunu yapmanın bir başka yolu Normal ifadeyle başını üfleme wihtout

Here is a link anlatan pozitif ve negatif lookaheads

+0

Bu, aslında bunu yaptığımda baktığım sayfa :), olumlu vs olumsuz bakışlara baktım, fakat denediğim değişiklikler verimliliği arttırmadı. – Duveit

1

Commons Lang den StringEscapeUtils kullanmak olacaktır. Her seferinde normal ifadeyi derleyen

+0

Bu kütüphanenin bazı bölümlerini kullanıyoruz, ancak sadece bu durumda ampersanları düzeltmemiz gerekiyor. Ve varlıklar ve basit bir karışımın bir karışımı olabilecek bir dizgeyi kabul etmek zorundadır. - Yine de teşekkürler. – Duveit

2

Sen ileriye bakma iddiasından & dışlamak gerekir.

&(?!#?[a-zA-Z0-9]{2,7};) 

Ya da daha doğrusu: Yani bu normal ifade denemek

&(?!(?:#(?:[xX][0-9a-fA-F]|[0-9]+)|[a-zA-Z]+);)