2010-06-02 13 views
8

Java kaynak kodundaki dize değişmezleriyle eşleşmek için Normal bir ifade arıyorum.Bir Java dizesi ile uyumlu bir şekilde eşleştirin

Mümkün mü?

private String Foo = "A potato"; 
private String Bar = "A \"car\""; 

Amacım, tüm dizeleri başka bir dizede başka bir şeyle değiştirmektir. Kullanıldığı şekilde:

+0

Evet. Ardından ne olduğunuzu daha iyi açıklamak için bir kaynak kod snippet'i sağlayabilir misiniz? – Wangnick

cevap

4

Tamam yorumlar. Öyleyse istediğin, bir String içinde, çift tırnak ile başlayan ve biten bir karakter dizisi aramaktır? Açgözlü olmayan .*? modelini unutmayın.

+1

Peki ya String içindeki String de teklifleri varsa? –

+0

Evet. Sonra ne. Nerede bittiğini nereden biliyorsun? Bu durumda, dış dizeyi oluştururken iç dizideki tırnakların bir şekilde kaçtığını, bunun yerine yedek dizinizle uğraştığını ve ardından sonucu gerektiği gibi tekrar tekrar görüntüleyeceğini görmelisiniz. Kaçan alıntıların olası bir yolu, örneğin, onları ikiye katlamaktır. – Wangnick

+0

Onlardan kaçmak için alıntılar yaparsanız, regexp'iniz zor olur. Daha iyi olanı muhtemelen kaçmayı (örneğin, html'de olduğu gibi) tanıtmak için başka bir karakter tanımlamak ve sonra da o olayın tüm oluşumlarından kurtulmaktır. – Wangnick

1

Java için farklı çözümleyici üreteçlerine ve StringLiteral dilbilgisi öğesi için düzenli ifadelerine bakabilirsiniz. İşte

bir example from ANTLR geçerli:

StringLiteral 
    : '"' (EscapeSequence | ~('\\'|'"'))* '"' 
    ; 
+0

Sanırım "//" merhaba " – aioobe

+0

'u yakalamaktan kaçınmak isterdim. Her zaman Java derleyicilerinin yorumları ön işlemden geçirdiklerini ve yalnızca diğer şeyleri aradıklarını hissettim. Ama bu konuda yanlış olabilirim. – Uri

+0

Bu sorunun cevabım, gramerlerle çok rahat olmadığım. –

-1

Sen (perl sed metin editörü ctrl-F vs vs?) Sizin bulgu yapmak için kullandığınız hangi aracı söyleme. Ama genel bir regex olacaktır:

\".*?\" 

Düzenleme: bu hızlı & kirli cevaptır ve kaçan tırnak baş vermez, vb

+3

Dizede kaçtılan alıntılar nedir? – Joe

+0

Java etiketini göz önünde bulundurarak Java regex'i hayal ediyorum. – corsiKa

+0

Bu, yorumlardaki alıntılarla eşleşecektir. Bu yanlış negatiflere sahip olmamalı, ancak kesinlikle yanlış pozitiflere sahip olacaktır. –

-1

bunu kullanın:

String REGEX = "\"[^\"]*\""; 

String A = "I went to the store to buy a \"coke\" and a box of \"kleenex\""; 
String B = A.replaceAll(REGEX,"Pepsi"); 

ile test edilmiştir aşağıdaki 'B'

I went to the store to buy a Pepsi and a box of Pepsi 
+0

Bu girişte deneyin: '" Çift tırnak is burada -> \ "<- burada \" "'. – seh

+0

@seh, örneğiniz için doğru çıktıyı nasıl değerlendirirsiniz? Asıl soru, tırnak işaretleri istemez -bu alıntılar, eşleştirilmemiş alıntılar, hatta çoktan alıntılanmış dizeler, bu konu için ... – tucuxi

+0

Bekleyeceğim 'Çift-alıntı' "Pepsi", soruyu okuyarak, " dize literal "bir dize tanımlamak için ana bilgisayar dili sözdiziminde geçerli herhangi bir içerik demek. Asıl soru, dizeler içinde sadece dizeleri söyleyerek daha zor vakaların kapsamı için sormadı, ama aynı zamanda düşünüyorum Problemi bu kadar ilginç kılan şey budur: Jeffrey Friedl'in * Mastering Regular Expressions * son çift tırnaklı dizgici serisini, RFC 822 e-posta adresi eşleştiricisinden bahsetmek için son derece etkili olduğunu hatırlatıyor.Tanırım bu, – seh

2
Bu normal ifadenin yanı çift tırnak işleyebilir

verir (NOT: genişletilmiş sözdizimi perl):

" 
[^\\"]* 
(?: 
    (?:\\\\)* 
    (?: 
     \\ 
     " 
     [^\\"]* 
    )? 
)* 
" 

her "o

belki bu biraz güzelleştirmek mümkündür önce \ kaçan tuhaf bir miktarda bulunması gerektiğini belirler, ancak bu formda çalışır

+0

ne ben yakın gerekli! Ancak, gömülü dize bir URL içeriyorsa ne olurdu? Örneğin: "URL Dizesi: \" http: \/\/www.google.com \ ";", bu ifade daha sonra sadece ";" yakalayarak kırılır. (Kafamı bunun için saatlerce çiziyorum) – TekuConcept