Regex wie prüfe ich, ob zwei zahlen nicht nebeneinadner sind z. B. String "94883" und ich will prüfen, dass 9 und 8 nie nebeneinander sind im String?

Backstein42  07.01.2022, 22:14

Welche programmiersprache?

jqiow2 
Fragesteller
 07.01.2022, 22:33

java

3 Antworten

Viel einfacher wäre es Nachzuschauen ob Deine Kombination in eigenem String enthalten ist und danach zu entscheiden in welche Richtung etwas (nicht) getan werden muss.

...allerdings kommst du nicht drumherum die betreffenden Ziffernkombinationen einzeln (getrennt durch | (or) ) aufzufühern.

import java.util.regex.*;
public class Main {
 public static void main(String[] args) {
  Pattern pattern = Pattern.compile("98|89");
  Matcher matcher = pattern.matcher("9883");
  boolean matchFound = matcher.find();
  if(!matchFound) {
   System.out.println("Nicht im String");
  }  else {
   System.out.println("im String");
  }
 }
}

public class Main {

   public static void main(String[] args) {

      String test = "94883";

      String zwischenSpeicher = "";

      boolean test2 = false;

      for(char i : test.toCharArray()) {

         if(i == '8' && zwischenSpeicher == "9") {

            test2 = true;

         }

         if(i == '9' && zwischenSpeicher == "8") {

            test2 = true;

         }

         else {

            zwischenSpeicher = "";

         }

         if(i == '8') {

            zwischenSpeicher = "8";

         }

         else if(i == '9') {

            zwischenSpeicher = "9";

         }

         else {

            zwischenSpeicher = "";

         }

         if(test2 == true) {

            System.out.println("8 und 9 liegen nebeneinander");

            test2 = false;

         }

      }

   }

}

Habs nicht getestet, aber das dürfte funktionieren:

(?:8[^9]|9[^8]|[^89])+
Woher ich das weiß:Studium / Ausbildung
Erzesel  08.01.2022, 10:12

geht so nicht...

Dein regex schaut lediglich ob eine der Kombis im String ist und macht erstmal nix weiter als dafür zu sorgen das alles was der Kombination entspricht rausgeschnitten wird, bis Match True ist.

(?:8[^9]|9[^8]|[^89])+

9889:
98      false
 88     true
  89    false =
88

Das positive Match ist 88 und wird zurückgegeben.

98893:
98      false
 88     true
  89    false
   93   true
=
8893

Das positive Match ist 8893 und wird zurückgegeben.

solange irgendwas im String ist was nicht dem Muster entspricht ist hast Du ein Match

komplexe negative Matches lassen sich nur sehr schwer definieren, da man alles ausschließen muss was zutreffen würde. deshalb einfach schauen ob etwas zutrifft und anschließend entsprechend handeln...

89|89

98893:
98      true
 88     false
  89    true
   93   false
=
98
89

true... die bösen zahlen sind im String

94869:
94      false
 48     false
  86    false
   69   false
=
nix

false keine bösen zahlen sind im String

0
JonnieDoe  08.01.2022, 10:40
@Erzesel

Naja, du brauchst in Java nur die Matches-Function von String verwenden.

Mit meinem RegEx bekommst du dann true wenn keine der Kombis enthalten ist.

& false wenn 89 oder 98 im String vorkommen.

Oder täusch ich mich da? 🤔

0
Erzesel  08.01.2022, 13:34
@JonnieDoe

du täuscht Dich...

Wenn auch wenn nur ein Teil der Prüfung True ergibt ist die Summe True, egal wie das Pattern nicht trifft.

Regex prüft immer ob das Muster auf den String passt. Wenn Du sagst suche nicht nach 98 , ist 98 false, trifft aber auf alles zu was nicht 98 ist...Da liegt die Crux. Damit triffst Du auch alles was sonst auch nicht ins Raster fällt. Regex "Fährt" von links nach rechts mit dem Pattern über den String... immer ein Zeichen weiter und prüft jeweils soviele Zeichen wie im Pattern definiert sind (oder einen Hit). (das kann auch fatale Formen annehmen)

...egal... schrittweise Dein Pattern auf einen String ohne 98 oder 89:

97873:
97      true (9 folgt nicht 8) passt
 78     true (schon die erste Ziffer ist nicht 9 ...oder 8) damit passt es schon
  87    true (8 folgt nicht 9) passt
   73   true (schon die erste Ziffer ist nicht 9 ...oder 8) 
=
97873

Du hast kein Match, wenn in keinem Prüfschritt ein True auftacht.

0