it-swarm.com.de

Regex, um eine ganze Zahl innerhalb einer Zeichenfolge zu finden

Ich möchte Regex mit Java verwenden.

Was ich tun möchte, ist die erste ganze Zahl in einem String zu finden.

Beispiel:

String = "the 14 dogs ate 12 bones"

Würde 14 zurückkehren.

String = "djakld;asjl14ajdka;sdj"

Würde auch 14 zurückkehren.

Das habe ich bis jetzt.

Pattern intsOnly = Pattern.compile("\\d*");
Matcher makeMatch = intsOnly.matcher("dadsad14 dssaf jfdkasl;fj");
makeMatch.find();
String inputInt = makeMatch.group();
System.out.println(inputInt);

Was mache ich falsch?

20
mscccc

Sie fragen nach 0 oder mehr Ziffern. Sie müssen nach 1 oder mehr fragen:

"\\d+"
49
Arkadiy

Es sieht so aus, als hätten die anderen Lösungen +/- und Fälle wie 2e3, die Java.lang.Integer.parseInt(String) unterstützen, nicht gehandhabt werden können, also nehme ich das Problem an. Ich bin mit regex etwas unerfahren, also habe ich vielleicht ein paar Fehler gemacht, etwas verwendet, das Javas Regex-Parser nicht unterstützt, oder es zu kompliziert gemacht, aber die Aussagen schienen in Kiki 0.5.6 zu funktionieren.

Alle regulären Ausdrücke werden sowohl in einem nicht maskierten Format zum Lesen bereitgestellt als auch in einem Escape-Format, das Sie als Stringliteral in Java verwenden können.

Um ein Byte, Short, Int oder Long aus einem String zu erhalten:

unescaped: ([\+-]?\d+)([eE][\+-]?\d+)?
  escaped: ([\\+-]?\\d+)([eE][\\+-]?\\d+)?

... und für Bonuspunkte ...

Um ein Double oder Float aus einem String zu erhalten:

unescaped: ([\+-]?\d(\.\d*)?|\.\d+)([eE][\+-]?(\d(\.\d*)?|\.\d+))?
  escaped: ([\\+-]?\\d(\\.\\d*)?|\\.\d+)([eE][\\+-]?(\\d(\\.\\d*)?|\\.\\d+))?
3
bgw

Wenn Sie versuchen, mit Ganzzahlen innerhalb eines Ausdrucks übereinzustimmen, so dass 1 + 2 - 3 nur mit 1, 2 und 3 und nicht mit 1, + 2 und - 3 übereinstimmt, müssen Sie zusätzlich zu den Angaben von PiPeep tatsächlich eine lookbehind-Anweisung und die Das gewünschte Teil wird tatsächlich von Matcher.group(2) und nicht nur von Matcher.group() zurückgegeben.

unescaped: ([0-9])?((?(1)(?:[\+-]?\d+)|)(?:[eE][\+-]?\d+)?)
  escaped: ([0-9])?((?(1)(?:[\\+-]?\\d+)|)(?:[eE][\\+-]?\\d+)?)

Für Dinge wie someNumber - 3, wo someNumber ein Variablenname oder ähnliches ist, können Sie auch verwenden 

unescaped: (\w)?((?(1)(?:[\+-]?\d+)|)(?:[eE][\+-]?\d+)?)
  escaped: (\\w)?((?(1)(?:[\\+-]?\\d+)|)(?:[eE][\\+-]?\\d+)?)

Das funktioniert natürlich nicht, wenn Sie eine Zeichenfolge wie The net change to blahblah was +4 analysieren.

0
AJMansfield

Verwenden Sie eine davon:

Pattern intsOnly = Pattern.compile("[0-9]+");

oder

Pattern intsOnly = Pattern.compile("\\d+");
0

die Java-Spezifikation gibt diesem Monster aus einem Regex tatsächlich die Möglichkeit, Doubles zu analysieren. Es wird jedoch als schlechte Praxis betrachtet, wenn nur versucht wird, mit dem beabsichtigten Typ zu analysieren und der Fehler aufzufangen, ist in der Regel etwas lesbarer.

DOUBLE_PATTERN = Pattern
        .compile("[\\x00-\\x20]*[+-]?(NaN|Infinity|((((\\p{Digit}+)(\\.)?((\\p{Digit}+)?)"
                + "([eE][+-]?(\\p{Digit}+))?)|(\\.((\\p{Digit}+))([eE][+-]?(\\p{Digit}+))?)|"
                + "(((0[xX](\\p{XDigit}+)(\\.)?)|(0[xX](\\p{XDigit}+)?(\\.)(\\p{XDigit}+)))"
                + "[pP][+-]?(\\p{Digit}+)))[fFdD]?))[\\x00-\\x20]*");
0
user3034617

Hier ist ein handliches, das ich mit Generika für C # erstellt habe. Es wird basierend auf Ihrem regulären Ausdruck übereinstimmen und die benötigten Typen zurückgeben:

public T[] GetMatches<T>(string Input, string MatchPattern) where T : IConvertible
    {
        List<T> MatchedValues = new List<T>();
        Regex MatchInt = new Regex(MatchPattern);

        MatchCollection Matches = MatchInt.Matches(Input);
        foreach (Match m in Matches)
            MatchedValues.Add((T)Convert.ChangeType(m.Value, typeof(T)));

        return MatchedValues.ToArray<T>();
    }

wenn Sie nur die Zahlen packen und in einem String [] -Array zurückgeben möchten:

string Test = "22$data44abc";
string[] Matches = this.GetMatches<string>(Test, "\\d+");

Hoffentlich ist das für jemanden nützlich ...

0
Chris Smith