2011-02-10 5 views
18

Próbowałem dowiedzieć się, jak wyodrębnić część ciągu między dwoma znakami specjalnymi i "Szukałem w regex, ale szczerze mówiąc nie mogę tego zrozumieć .
przykład w kodzie Java:Java-Extract część ciągu między dwoma znakami specjalnymi

String str="21*90'89\""; 

chciałbym wyciągnąć 89

Generalnie chciałbym tylko wiedzieć, jak wyodrębnić część łańcucha pomiędzy dwoma konkretnymi postaciami proszę

.

Także to byłoby miło wiedzieć, jak wyodrębnić część łańcucha od początku do specyficznego charakteru lubią się 21.

+0

Jeszcze sekundę ... wyciągnąć 89? Masz na myśli 90, prawda? –

+0

Twój przykładowy kod jest nieprawidłowy Java. Czy nie brakuje Ci cytatów? –

+0

Ok, teraz, gdy zobaczyłem komentarz Marka, dostaję go. Cytat jest częścią twojego ciągu. –

Odpowiedz

28

Spróbuj tego wyrażenia regularnego:

'(.*?)" 

jako ciąg Java dosłownym będzie trzeba napisać to w następujący sposób:

"'(.*?)\"" 

Oto bardziej kompletny przykład pokazujący, jak używać tego wyrażenia regularnego z Matcher:

Pattern pattern = Pattern.compile("'(.*?)\""); 
Matcher matcher = pattern.matcher(str); 
if (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

Zobacz pracuje w trybie online: ideone

+0

Dzięki za pomoc działa jak urok – bryan

+0

nie działa, gdy" jest powtórzone, tj. "21 * 90'90'89 \" ", zwrócił" 90'9089 " –

10

Jeśli będziesz zawsze mieć ciąg takiego (z 3 części), to wystarczy:

String str= "21*90'89\""; 
String between = str.split("\"|'")[1]; 
4

Inną opcją, jeśli można zapewnić, że swoimi strunami zawsze będzie w formacie podasz, można użyć szybkiego i brzydka rozwiązanie podciąg/indexOf:

str.substring(str.indexOf("'") + 1, str.indexOf("\"")); 

i uzyskać drugi kawałek danych, hasła:

str.substring(0, str.indexOf("*")); 
4
public static void main(final String[] args) { 
    final String str = "21*90'89\""; 
    final Pattern pattern = Pattern.compile("[\\*'\"]"); 
    final String[] result = pattern.split(str); 
    System.out.println(Arrays.toString(result)); 
} 

jest to, czego szukasz ... Program opisany powyżej produkuje:

[21, 90, 89] 
+0

To jest dokładnie to, czego potrzebowałem, chociaż moje pytanie nie sprawiło, że się tak wydawało ... wielkie dzięki – bryan

-2
String str= 21*90'89; 
String part= str.split("[*|']"); 
System.out.println(part[0] +""+part[1]); 
+0

-1: A) nie kompiluje, B) @Goran Jovic odpowiedział zasadniczo to samo około 11 minut wcześniej, C) wypisuje "2189", co nie wygląda na to, czego szuka OP –

0

tęsknię najprostsze możliwe rozwiązanie tutaj:

str.replaceFirst(".*'(.*)\".*", "$1"); 

To rozwiązanie jest zdecydowanie najkrótsze, jednak ma pewne wady:

  • W przypadku, gdy napis wygląda inaczej, cały ciąg znaków zostanie wycofany bez ostrzeżenia.
  • Nie jest to zbyt efektywne, ponieważ używane regex jest kompilowane dla każdego użycia.

Nie użyłbym tego, z wyjątkiem jako szybki hack lub gdybym był naprawdę pewien formatu wejściowego.

0
String str="abc#[email protected]!tp?pqr*tsd";    
    String special="[email protected]#$%^&*()/<>{}[]:;'`~";   
    ArrayList<Integer> al=new ArrayList<Integer>();   
    for(int i=0;i<str.length();i++) 
    { 
     for(int j=0;j<special.length();j++) 
      if(str.charAt(i)==special.charAt(j))   
       al.add(i); 
    } 
    for(int i=0;i<al.size()-1;i++) 
    { 
     int start=al.get(i); 
     int end=al.get(i+1); 
     for(int j=start+1;j<end;j++) 
      System.out.print(str.charAt(j)); 
     System.out.print(" "); 
    }