Regex, чтобы найти целое число в строке - PullRequest
20 голосов
/ 16 декабря 2008

Я бы хотел использовать регулярные выражения с 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);

Что я делаю не так?

Ответы [ 6 ]

50 голосов
/ 16 декабря 2008

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

"\\d+"
3 голосов
/ 11 сентября 2010

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

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

Чтобы получить байт, short, int или long из строки:

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

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

Чтобы получить двойное число или число с плавающей точкой:

unescaped: ([\+-]?\d(\.\d*)?|\.\d+)([eE][\+-]?(\d(\.\d*)?|\.\d+))?
  escaped: ([\\+-]?\\d(\\.\\d*)?|\\.\d+)([eE][\\+-]?(\\d(\\.\\d*)?|\\.\\d+))?
0 голосов
/ 26 декабря 2018

Используйте один из них:

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

или

Pattern intsOnly = Pattern.compile("\\d+");
0 голосов
/ 02 сентября 2016

спецификация 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]*");
0 голосов
/ 20 декабря 2012

В дополнение к тому, что сказал 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

0 голосов
/ 23 октября 2009

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

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

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

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

Надеюсь, это кому-нибудь пригодится ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...