it-swarm.com.de

Wie stimmen Buchstaben nur mit Java-Regex überein, entspricht die Methode?

import Java.util.regex.Pattern;

class HowEasy {
    public boolean matches(String regex) {
        System.out.println(Pattern.matches(regex, "abcABC   "));
        return Pattern.matches(regex, "abcABC");
    }

    public static void main(String[] args) {
        HowEasy words = new HowEasy();
        words.matches("[a-zA-Z]");
    }
}

Die Ausgabe ist False. Wohin gehe ich falsch? Ich möchte auch prüfen, ob ein Wort nur Buchstaben enthält und möglicherweise nicht mit einem Punkt endet. Was ist der Regex dafür?

d. h. abc abc. ist gültig, aber "abc .." ist nicht gültig. 

Ich kann die indexOf()-Methode verwenden, um sie zu lösen, aber ich möchte wissen, ob es möglich ist, einen einzelnen Regex zu verwenden. 

19
user244333

"[a-zA-Z]" stimmt nur mit einem Zeichen überein. Um mehrere Zeichen zu finden, verwenden Sie "[a-zA-Z]+".

Da ein Punkt für jedes Zeichen ein Joker ist, müssen Sie ihn maskieren: "abc\." Um den Punkt optional zu machen, benötigen Sie ein Fragezeichen: "abc\.?" 

Wenn Sie das Muster als Literalkonstante in Ihren Code schreiben, müssen Sie den umgekehrten Schrägstrich maskieren:

System.out.println ("abc".matches ("abc\\.?"));
System.out.println ("abc.".matches ("abc\\.?"));
System.out.println ("abc..".matches ("abc\\.?"));

Beide Muster kombinieren:

System.out.println ("abc.".matches ("[a-zA-Z]+\\.?"));

Anstelle von a-zA-Z ist\w oft besser geeignet, da es fremde Zeichen wie äöüßø usw. erfasst:

System.out.println ("abc.".matches ("\\w+\\.?"));   
39
user unknown

[A-Za-z ]* für Buchstaben und Leerzeichen.

6
kgautron

Die matches-Methode führt den Abgleich der gesamten Zeile durch, d. h. sie entspricht find() mit '^ abc $'. Verwenden Sie einfach stattdessen Pattern.compile("[a-zA-Z]").matcher(str).find(). Dann reparieren Sie Ihre Regex. Als @user unknown wurde erwähnt, dass Ihre Regex tatsächlich nur einem Zeichen entspricht. Sie sollten wahrscheinlich [a-zA-Z]+ sagen

3
AlexR

Drei Probleme hier:

  1. Verwenden Sie einfach String.matches() - wenn die API vorhanden ist, verwenden Sie sie
  2. In Java bedeutet "Übereinstimmungen" "Übereinstimmungen die gesamte Eingabe", was IMHO kontraintuitiv ist. Lassen Sie also die API Ihrer Methode erkennen, dass Anrufer über die Übereinstimmung von Teil der Eingabe nachdenken, wie es Ihr Beispiel empfiehlt
  3. Ihr Regex entspricht nur einem Zeichen

Ich empfehle Ihnen, Code wie folgt zu verwenden:

public boolean matches(String regex) {
    regex = "^.*" + regex + ".*$"; // pad with regex to allow partial matching
    System.out.println("abcABC   ".matches(regex));
    return "abcABC   ".matches(regex);
}

public static void main(String[] args) {
    HowEasy words = new HowEasy();
    words.matches("[a-zA-Z]+"); // added "+" (ie 1-to-n of) to character class
}
0
Bohemian
import Java.io.BufferedReader;
import Java.io.IOException;
import Java.io.InputStreamReader;
import Java.util.regex.*;

/* Write an application that prompts the user for a String that contains at least
 * five letters and at least five digits. Continuously re-Prompt the user until a
 * valid String is entered. Display a message indicating whether the user was
 * successful or did not enter enough digits, letters, or both.
 */
public class FiveLettersAndDigits {

  private static String readIn() { // read input from stdin
    StringBuilder sb = new StringBuilder();
    int c = 0;
    try { // do not use try-with-resources. We don't want to close the stdin stream
      BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
      while ((c = reader.read()) != 0) { // read all characters until null
        // We don't want new lines, although we must consume them.
        if (c != 13 && c != 10) {
          sb.append((char) c);
        } else {
          break; // break on new line (or else the loop won't terminate)
        }
      }
      // reader.readLine(); // get the trailing new line
    } catch (IOException ex) {
      System.err.println("Failed to read user input!");
      ex.printStackTrace(System.err);
    }

    return sb.toString().trim();
  }

  /**
   * Check the given input against a pattern
   *
   * @return the number of matches
   */
  private static int getitemCount(String input, String pattern) {
    int count = 0;

    try {
      Pattern p = Pattern.compile(pattern);
      Matcher m = p.matcher(input);
      while (m.find()) { // count the number of times the pattern matches
        count++;
      }
    } catch (PatternSyntaxException ex) {
      System.err.println("Failed to test input String \"" + input + "\" for matches to pattern \"" + pattern + "\"!");
      ex.printStackTrace(System.err);
    }

    return count;
  }

  private static String reprompt() {
    System.out.print("Entered input is invalid! Please enter five letters and five digits in any order: ");

    String in = readIn();

    return in;
  }

  public static void main(String[] args) {
    int letters = 0, digits = 0;
    String in = null;
    System.out.print("Please enter five letters and five digits in any order: ");
    in = readIn();
    while (letters < 5 || digits < 5) { // will keep occuring until the user enters sufficient input
      if (null != in && in.length() > 9) { // must be at least 10 chars long in order to contain both
        // count the letters and numbers. If there are enough, this loop won't happen again.
        letters = getitemCount(in, "[A-Za-z]");
        digits = getitemCount(in, "[0-9]");

        if (letters < 5 || digits < 5) {
          in = reprompt(); // reset in case we need to go around again.
        }
      } else {
        in = reprompt();
      }
    }
  }

}
0
Agi Hammerthief