2010-04-09 17 views
5

yılında olanlarla eşleşmiyor karakterleri bu regex var değiştirin:bir regex

private static final String SPACE_PATH_REGEX ="[a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+"; 

benim dize bu normal ifadeyle eşleşir olmadığını kontrol edin ve IF DEĞİL, ben burada olmayan tüm karakterleri değiştirmek istiyoruz, ile "_".

ben gibi denedim:

private static final String SPACE_PATH_REGEX_EXCLUDE = 
     "[~a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+"; 
if (myCompanyName.matches(SPACE_PATH_REGEX)) { 
    myNewCompanySpaceName = myCompanyName; 
} else{ 
    myNewCompanySpaceName = myCompanyName.replaceAll(
      SPACE_PATH_REGEX_EXCLUDE, "_"); 
} 

ama çalışmıyor ... aşağıdaki karakter ihmal değil gibi görünüyor 2 regex "~" o kadar.

Herhangi bir fikrin var mı?

cevap

8

Sen regex (kuralları için Pattern class bakınız) çeşitli sorunları var: Bir karakter sınıfı içinde

  • | özel bir anlamı vardır ve karakterinizi istemedikçe (sizin durumunuzda değiştirmeden çıkarılmalıdır literal | karakterini dahil etmek için sınıf.
  • Benzer bir karakter sınıfı içinde /, _ ve + kaçmak için gerekmez.
  • -
  • sadece son karakteri
  • ~ da sadece kendini gösteren bir karakter sınıfı içinde özel bir anlamı vardır değilse kaçış olması gerekiyor
  • bir karakter grubunun içeriğini geçersiz kılmak için ^ kullanmak isteyecektir. hiçbir şey zaten eşleşirse replaceAll() çağrı değiştirilmemiş bir dize döndürür olarak

Ayrıca, ilk matches() denetimi atlayabilirsiniz. o (ve ikinci normal ifade) sadece böcek saklanabileceği başka bir yer tanıtır yarar tutulması (örneğin yanlışlıkla bir regex güncellemek, ancak diğer olamazdı).

+0

Net açıklama için çok teşekkürler. –

4

deneyin: Eğer desen içine gereksiz | s koyuyoruz

final String SPACE_PATH_REGEX_EXCLUDE = "[^\\w~/\\-+]"; 
String out = in.replaceAll(SPACE_PATH_REGEX_EXCLUDE, "_"); 

sahip birincil konudur. Farklı bir anlamı var. Ayrıca, \w ifadesini kullanarak, "kelime karakteri" anlamına gelen, harfler (büyük harf veya küçük harf), rakam veya alt çizgi anlamına gelen ve [A-Za-z0-9_] ile eşanlamlı olan ifadeyi büyük ölçüde basitleştirebilirsiniz.

Ayrıca eserlerini kaçan nasıl anlamamız gerekir. Java dizgisi kaçıyor, bu yüzden desene bir ters eğik çizgi koymak için \\'u yerleştiriyorsunuz. Ama regex de kaçıyor. Örneğin,bir Java Dizesi yeni satır karakteridir ve \\n, bir satırsonu karakteri görüntülemek üzere \n modelini bir desene sokar.

  1. Sen \Q...\E kullanabilirsiniz:

    Metnin bir demet kaçan iki uygun seçenekler var.\Q ve \E arasındaki her şeyden kaçınıyor; ve

  2. Rasgele bir dizge alıntılamak için Pattern.quote() kullanabilirsiniz.

Düzenli aralıklarla belirli sekanslardan kurtulmanız gereken bağlamsaldır. Örneğin - sadece bir aralık belirtmekle karıştırılabilirse kaçmak gerekir. [a-z], küçük harf karakteridir. [a\-z], a, - veya z'dan biridir. Ancak bir küçük harf ve ardından küçük harfli bir harf belirtmek için -[a-z] yapabilirsiniz. Not: İlk kısa çizgiden kaçmanıza gerek yoktur.

+0

Bence kaçman gerek. –