2009-05-25 12 views

Antwort

12

Das ist keine normale Sprache und kann daher nicht von einem Vanille-Regex erfasst werden. Es kann möglich sein, auf jeden Fall, aber es wird mit ziemlicher Sicherheit einfacher, nicht einen regulären Ausdruck zu verwenden:

public static boolean moreDigitsThanNonDigits(String s) { 
    int diff = 0; 
    for(int i = 0; i < s.length(); ++i) { 
     if(Character.isDigit(s.charAt(i))) ++diff; 
     else --diff; 
    } 
    return diff > 0; 
} 
0

Ich bin nicht sicher, dass reguläre Ausdrücke hier die beste Lösung wäre.

+0

ich nicht darauf bestehen, regulären Ausdruck auf verwenden, muss ich irgendwie diese Zeichenfolgen identifizieren. –

10

Sie werden nicht in der Lage sein, eine Regexp zu schreiben, die dies tut. Aber du hast bereits gesagt, dass du Java verwendest, warum nicht ein wenig Code mischen?

public boolean moreDigitsThanNonDigits(String input) { 
    String nonDigits = input.replace("[0-9]",""); 
    return input.length() > (nonDigits.length * 2); 
} 
+0

Hallo, kannst du bitte meine Zweifel klären, indem ich java.util.regex pacakgae benutze, kann ich nach irgendwelchen Mustern in den Textdateien oder in irgendeinem Dateiformat suchen? – gmhk

+0

Die verschiedenen java.lang.String 'replace ...' Methoden können Regex bereits akzeptieren. Es ist nicht nötig, eigene Pattern-, Matcher- und andere Instanzen einzubinden. –

0

Regex allein kann nicht (da sie nichts zählen); aber wenn Sie sie verwenden möchten, dann verwenden Sie einfach zwei Ersatz: eine, die alle Ziffern ausstreicht und eine, die nur sie hält. Vergleichen Sie dann die Stringlängen der Ergebnisse.

natürlich würde ich Daves Antwort lieber verwenden.

+0

Hallo, Könntest du bitte meine Zweifel klären, indem ich java.util.regex pacakgae benutze, kann ich nach irgendwelchen Mustern in den Textdateien oder in irgendeinem Dateiformat suchen? – gmhk

+0

Da reguläre Ausdrücke zum Vergleichen der Muster in einer Zeichenfolge verwendet werden, bezweifle ich dann, ob Google das Musterkonzept durchsucht, um in allen Dateien zu suchen. – gmhk

+0

Google vergleicht FAR mehr als nur Regex mit einigen Dateien. –

3

Reguläre Ausdrücke sind konzeptionell nicht in der Lage, eine solche Aufgabe zu erfüllen. Sie sind äquivalent zu formalen Sprachen oder (regulären) Automaten. Sie haben keine Vorstellung von Speicher (oder einem Stapel), so dass sie das Auftreten von Symbolen nicht zählen können. Die nächste Erweiterung in Bezug auf die Ausdruckskraft sind Push-Down-Automaten (oder Stapelmaschinen), die kontextfreien Grammatiken entsprechen. Bevor Sie eine solche Grammatik für diese Aufgabe schreiben, wäre eine Methode wie die obige moreDigitsThanNonDigits geeignet.

+2

Perl- (und Java-) style reguläre Ausdrücke sind aufgrund der "\ number" -Syntax für das Zurückverfolgen einer erfassten Gruppe tatsächlich leistungsfähiger als normale Sprachen. Sie können Sprachen erkennen, die nicht regelmäßig sind. Zum Beispiel kann die Sprache jedes Strings, der zweimal wiederholt wird (was nicht regulär oder sogar kontextfrei ist), durch "(. *) \ 1" erkannt werden. – newacct

+0

Vielen Dank, dass Sie darauf hingewiesen haben! Ihr Beispiel wäre "(. *) \ 1 \ 1", richtig? Aber Längenvergleiche sind immer noch nicht möglich, würde ich annehmen. – miku

1

Wie bereits erwähnt, ist die betreffende Sprache nicht regulär und kann nicht mit einem regulären Ausdruck erkannt werden.

Ich gebe Ihnen eine weitere Möglichkeit, die Anzahl der Ziffern und die Anzahl der Nicht-Ziffern in einer Zeichenfolge mit Regex zu zählen !!

Mit der Methode String.replaceAll können Sie alle Nicht-Ziffern in der Eingabezeichenfolge löschen. Die Länge der resultierenden Zeichenfolge entspricht der Anzahl der Ziffern in der Eingabe.

In ähnlicher Weise können Sie alle Ziffern in der Eingabezeichenfolge löschen, und die Länge der resultierenden Zeichenfolge entspricht der Anzahl der Nicht-Ziffern in der Eingabezeichenfolge.

public static boolean test(String str) { 
     int numDigits = str.replaceAll("\\D","").length(); 
     int numNonDigits = str.replaceAll("\\d","").length(); 

     return numDigits > numNonDigits; 
} 

Ideone Link

Verwandte Themen