2017-07-08 10 views
5

Próbuję podzielić ciąg na wiele ciągów, ale zamiast za pomocą ciągu tylko jeden prosty wzór regex, próbuję użyć wzorca regex, który podzieli do różnych ciągów znaków, jeśli wykryje określone znaki, ale znaki są różne. Zamiast rozdzielać ciąg na różne ciągi, daje mi to wszystkie poszczególne znaki we wspomnianym łańcuchu.Podziel ciąg na wiele ciągów przy użyciu regeksu z różnymi grupami przechwytywania

String[] splitstr = line.split("([&]{2})?([|]{2})?(!=)?"); 

Stosując powyższą linię, mam zmienna nazywa line który jako przykład, kładę tę linię z pliku:

:if[input=right || input=Right]: 

jestem po prostu zastanawiasz się, czy istnieje sposób, aby uczynić ten rozłam w

":if[input=right", "input=Right]:" 

I jeśli mogę umieścić w jednej linii tak:

:if[input=right || input=Right && input != null]: 

tak, że dzieli

":if[input=right", "input=Right", "input != null]:" 

używałem String#split(regex) dla || symbolem i to działało dobrze, ale teraz, że chcę podzielić gdziekolwiek są || lub && lub != i chcę mój kod, aby był wydajny i czysty oraz łatwy do odczytania.

Odpowiedz

2

klasy Javy poniżej podzieli twój przykładowy ciąg na części, które cię interesują. Kod zostanie podzielony oryginalny ciąg w ogóle "|| ' i '& &' delimetry, globalnie. To znaczy, jeśli masz więcej niż jeden "||" lub "& &" operator w oryginalnym łańcuchu, każda część zostanie podzielona.

Należy zwrócić uwagę na potrzebę ucieczki (\) znaków specjalnych. W Javie musisz uciec przed ucieczką, więc potrzebujesz 2 odwrotnych ukośników, aby mieć literał w swoim ciągu.

Oto doskonałe miejsce, aby przetestować kod regex ... Regular Expressions 101

public class splitStrRegex { 

    public static void main(String[] args) { 

     String myStr = ":if[input=right || input=Right && input != null]:"; 
     String[] myStrings = myStr.split("\\|\\||&&"); 
     for(int i = 0; i < myStrings.length; i++) { 
      System.out.println(myStrings[i].trim()); 
     } 
    } 
} 

wyjściowa:

:if[input=right 
input=Right 
input != null]: 
+0

Oh my god Myślałam, że to był jakiś specjalny użycie symbolu rury , Cieszę się, że kazałeś mi uciec z fajki! Dzięki! –

+0

Cieszę się, że mogę pomóc @AlexCouch. Nie zapomnij zagłosować na swoje ulubione odpowiedzi, a także dzięki za świetne pytanie! – MJFoster

0

To bardzo interesujące pytanie. Istnieje więcej odpowiedzi dla że na miejscu jak: Java String.split() Regex Ponadto, jest tak łatwe do sprawdzenia, jak:

public class Reg { 

    public static void main(String args[]) { 
     String string = "00!=4-0||34 & 55!=6"; 
     String[] parts = string.split("[&||!=]"); 
     for (int i = 0; i < parts.length; i++) { 
      System.out.println("Part: " + parts[i]); 
     } 
    } 
} 

WYJŚCIE:

Part: 00 
Part: 
Part: 4-0 
Part: 
Part: 34 
Part: 55 
Part: 
Part: 6 

Ale problem z symbolem "& &" na przykład: dla:

String string = "00!=4-0||34 && 55!=6"; 
    String[] parts = string.split("[&&||!=]"); 

WYJŚCIE:

Part: 00 
Part: 
Part: 4-0 
Part: 
Part: 34 && 55 
Part: 
Part: 6 

mogę się domyślać, że musimy zrozumieć & & w innej interpretacji, na przykład:

public class Reg { 

    public static void main(String args[]) { 
     String string = "00!=4-0||34 && 55!=6"; 
     String[] parts = string.split("[&^&||!=]"); 
     for (int i = 0; i < parts.length; i++) { 
      System.out.println("Part: " + parts[i]); 
     } 
    } 
} 

WYJŚCIE:

Part: 00 
Part: 
Part: 4-0 
Part: 
Part: 34 
Part: 
Part: 55 
Part: 
Part: 6