SORU
14 Aralık 2008, Pazar


Tek veya çift tırnak içine alınmış ne zaman bölme bir dize alanı kullanarak düzenli

Düzenli ifadeler yeniyim ve yardım bekleriz. Birlikte örnek dize tek veya çift tırnak içinde olmayan alanlarda kullanarak bölünmüş bir ifade koymaya çalışıyorum. Benim son girişimi şöyle: (?!") ve oldukça işe yaramıyor. Alıntı önce uzay bölünüyor.

Örnek giriş:

This is a string that "will be" highlighted when your 'regular expression' matches something.

Çıkış istenen:

This
is
a
string
that
will be
highlighted
when
your
regular expression
matches
something.

"will be" 'regular expression' kelimeler arasındaki boşluğu korumak unutmayın.

CEVAP
14 Aralık 2008, Pazar


Diğerleri gibi karmaşık düzenli ifadeler ya da bu kadar uzun kod öneriyorlar anlamıyorum. Aslında, ister iki türlü şeyler gelen string: karakter dizileri değil boşluk veya tırnak ve dizilerin karakterleri başlayan ve son bir alıntı, hiçbir tırnak işaretleri arasında, iki çeşit teklif. Kolayca bu düzenli ifade ile o şeyler maç olabilir:

[^\s"'] |"([^"]*)"|'([^']*)'

Listedeki tırnak istemediğin için yakalama grupları ekledim.

Bu Java kod listesini, eğer tırnak işaretleri hariç tutmak için, ve eğer yakalama grubunu maç yoktu ama genel olarak normal ifade eşleşme ekleme tutuyorsa yakalama grubunu ekleme (tırnaksız bir kelime eşleşti) oluşturur.

List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("[^\\s\"'] |\"([^\"]*)\"|'([^']*)'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    if (regexMatcher.group(1) != null) {
        // Add double-quoted string without the quotes
        matchList.add(regexMatcher.group(1));
    } else if (regexMatcher.group(2) != null) {
        // Add single-quoted string without the quotes
        matchList.add(regexMatcher.group(2));
    } else {
        // Add unquoted word
        matchList.add(regexMatcher.group());
    }
} 

Eğer iade listesinde tırnak olmasının bir sakıncası yok, varsa bile, çok daha basit bir kod kullanabilirsiniz:

List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("[^\\s\"'] |\"[^\"]*\"|'[^']*'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    matchList.add(regexMatcher.group());
} 

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Carlos Delgado

    Carlos Delga

    21 HAZİRAN 2011
  • ETrade Supply

    ETrade Suppl

    23 Temmuz 2011
  • LIVESTRONG.COM

    LIVESTRONG.C

    5 EKİM 2005