Подтвердить что ты не робот

Regex найти целое число внутри строки

Я хотел бы использовать regex с Java.

Что я хочу сделать, это найти первое целое число в строке.

Пример:

String = "the 14 dogs ate 12 bones"

Вернется 14.

String = "djakld;asjl14ajdka;sdj"

Также вернется 14.

Это то, что у меня есть до сих пор.

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

Что я делаю неправильно?

4b9b3361

Ответ 1

Вы запрашиваете 0 или более цифр. Вам нужно запросить 1 или больше:

"\\d+"

Ответ 2

Похоже, что другим решениям не удалось обработать +/- и такие случаи, как 2e3, поддержка java.lang.Integer.parseInt(String), поэтому я пойду на эту проблему. Я немного неопытен в регулярном выражении, поэтому я, возможно, допустил несколько ошибок, использовал то, что парсер Java regex не поддерживает, или сделал его чрезмерно сложным, но показания, казалось, работали в Kiki 0.5.6.

Все регулярные выражения предоставляются как в незапрограммированном формате для чтения, так и в формате escaped, который можно использовать в качестве строкового литерала в Java.

Чтобы получить байт, короткий, int или длинный от строки:

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

... и для бонусных очков...

Чтобы получить double или float из строки:

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

Ответ 3

Это удобный, который я сделал для С# с дженериками. Он будет соответствовать вашим регулярным выражениям и возвращать нужные вам типы:

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>();
    }

то, если вы хотите захватить только числа и вернуть их в строку [] array:

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

Надеюсь, это полезно кому-то...

Ответ 4

В дополнение к тому, что сказал PiPeep, если вы пытаетесь сопоставить целые числа внутри выражения, так что 1 + 2 - 3 будет соответствовать только 1, 2 и 3, а не 1, + 2 и - 3, вам действительно нужно использовать оператор lookbehind, а часть, которую вы хотите, будет фактически возвращена Matcher.group(2), а не только Matcher.group().

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

Кроме того, для таких вещей, как someNumber - 3, где someNumber - имя переменной или что-то в этом роде, вы можете использовать

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

Хотя, конечно, это не работает, если вы разбираете строку типа The net change to blahblah was +4

Ответ 5

спецификация java действительно дает этому монстру регулярное выражение для парсинга двойников. однако это считается плохой практикой, просто пытаясь разобрать с предполагаемым типом и поймать ошибку, имеет тенденцию быть немного читабельнее.

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]*");