2013-05-25 10 views
9

Próbuję napisać wyrażenie regularne w Javie, aby znaleźć treść między pojedynczymi cudzysłowami. Czy ktoś może mi w tym pomóc? Próbowałem następujących ale to nie działa w niektórych przypadkach:Java regex content between single quotes

Pattern p = Pattern.compile("'([^']*)'"); 
  1. test Obudowa: 'Tumblr' jest niesamowite app oczekiwany wynik: Tumblr

  2. Przypadek Testowy : Tumblr to niesamowita "aplikacja" Oczekiwana moc: aplikacja

  3. Przypadek Testowy: Tumblr jest 'amazing' app oczekiwany wynik: niesamowite

  4. Przypadek Testowy: Tumblr jest 'super' i 'niesamowite' oczekiwany wynik: niesamowite, niesamowite

  5. Przypadek testowy: użytkowników tumblr jest są rozczarowani oczekiwany wynik: BRAK

  6. Przypadek Testowy: Tumblr jest „nabycie” kompletna ale lojalność użytkowników wątpliwe oczekiwany wynik: nabycie

Doceniam jakiejkolwiek pomocy z tym.

Dzięki.

+0

Jest nie ma potrzeby wymuszania braku spacji w cudzysłowach (co sprawi, że _'esoneone and amazing'_ not be dopasowane), możesz po prostu rozejrzeć się w cudzysłowie. –

Odpowiedz

12

To powinno załatwić sprawę:

(?:^|\s)'([^']*?)'(?:$|\s) 

Przykład: http://www.regex101.com/r/hG5eE1

W Java (ideone):

import java.util.*; 
import java.lang.*; 
import java.util.regex.*; 

class Main { 

     static final String[] testcases = new String[] { 
      "'Tumblr' is an amazing app", 
     "Tumblr is an amazing 'app'", 
     "Tumblr is an 'amazing' app", 
     "Tumblr is 'awesome' and 'amazing' ", 
     "Tumblr's users' are disappointed ", 
     "Tumblr's 'acquisition' complete but users' loyalty doubtful" 
     }; 

    public static void main (String[] args) throws java.lang.Exception { 
     Pattern p = Pattern.compile("(?:^|\\s)'([^']*?)'(?:$|\\s)", Pattern.MULTILINE); 
     for (String arg : testcases) { 
      System.out.print("Input: "+arg+" -> Matches: "); 
      Matcher m = p.matcher(arg); 
      if (m.find()) { 
       System.out.print(m.group()); 
       while (m.find()) System.out.print(", "+m.group()); 
       System.out.println(); 
      } else { 
       System.out.println("NONE"); 
      } 
     } 
    } 
} 
+0

Zdałem sobie sprawę, że twoja odpowiedź jest bardziej niezawodna, ponieważ testowałem więcej scenariuszy. Chciałbym mieć wystarczającą reputację, aby upominać się o odpowiedź. – user1744332

+0

nie jest to kompletne, ponieważ pojedyncze cudzysłowy są częścią wyjścia ;-). Można to naprawić za pomocą m.group(). Replace ('\' ',' \ u0000 ') – dermoritz

+0

@dermoritz nie ma takiej potrzeby; to samo wyrażenie wywoła ciąg znaków z cudzysłowami w grupie (0) i bez cudzysłowów w grupie (1). http://ideone.com/m9t1AF –

0

Wypróbuj ten prosty wzór regex:

'([^\s']+)' 

i kod testu:

try { 
    Pattern regex = Pattern.compile("'([^\\s']+)'"); 
    Matcher regexMatcher = regex.matcher(subjectString); 
    while (regexMatcher.find()) { 
     for (int i = 1; i <= regexMatcher.groupCount(); i++) { 
      // matched text: regexMatcher.group(i) 
      // match start: regexMatcher.start(i) 
      // match end: regexMatcher.end(i) 
     } 
    } 
} catch (PatternSyntaxException ex) { 
    // Syntax error in the regular expression 
} 
0

Tylko nie pozwól ' ' pojawiają się na wyjściu. Użyj tej regex:

'([^' ]*)'

Albo upewnij się, że para cytat jest owinięty spacjami.

(?:^|)'([^']*)'(?: |$)
+0

To nie pasuje do "..." niesamowitego i pięknego "..." –

+0

@guido Wypróbuj nowe rozwiązanie. – johnchen902

+0

lepiej, ale wciąż masz spację zamiast białych znaków i nie dostajesz końca linii (wtedy jest jak moja ;-)) –

3

Jeśli nie zezwalają na pojedynczy znak cudzysłowu, ' lub znak spacji, ' ', być we wzorcu, to jesteś dobry, aby przejść.Kiedyś + bo zakłada, że ​​nie chcesz pusty wpis (jeśli nie, zmień go z powrotem do *):

Pattern p = Pattern.compile("'([^' ]+)'"); 
+0

To działa na wejście, trudno zauważyć, że Paul Vargas i mój wzorzec akceptowaliby również białe znaki w dopasowanym sznurku. –

+0

Zgadzam się; twoje rozwiązania są dobre i mają sens, ale żaden z przykładowych danych nie sugerował, że OP chciał przechwycić wiele słów, więc starając się trzymać go jak najbliżej kodu/ograniczeń OP, wpadłem na to. –

+0

tak. Zgadzam się z @guido. – user1744332

1

Spróbuj następny:

'\w+'|'\w+(\s\w+)*' 

https://github.com/paul-vargas/java-regex-ui