Регулярное выражение для получения первого числа в строке с другими символами

#java #regex

#java #регулярное выражение

Вопрос:

Я новичок в регулярных выражениях, и мне было интересно, как я могу получить только первое число в строке, например 100 2011-10-20 14:28:55 . В этом случае я бы хотел, чтобы он вернулся 100 , но число также может быть короче или длиннее.

Я думал о чем-то подобном [0-9] , но он принимает каждое отдельное число отдельно (100,2001,10, …)

Спасибо.

Комментарии:

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

2. Я знаю, что строка всегда начинается с числа. Он всегда следует приведенному мной шаблону. (время даты валютирования)

3. Почему бы просто не поискать первое свободное место?

Ответ №1:

 /^[^d]*(d )/
 

Это начнется с начала, пропустит любые не цифры и сопоставит первую найденную последовательность цифр

РЕДАКТИРОВАТЬ: это регулярное выражение будет соответствовать первой группе чисел, но, как указывалось в других ответах, parseInt является лучшим решением, если вы знаете, что число находится в начале строки

Комментарии:

1. Это регулярное выражение работало для меня (RegExr и Python), чтобы соответствовать первым цифрам, независимо от того, что предшествует: /[^d]*(d )/

Ответ №2:

Попробуйте сделать это, чтобы найти первое число в строке (которое может быть не в начале строки).:

     String s = "2011-10-20 525 14:28:55 10";
    Pattern p = Pattern.compile("(^|\s)([0-9] )($|\s)");
    Matcher m = p.matcher(s);
    if (m.find()) {
        System.out.println(m.group(2));
    }
 

Ответ №3:

Просто

 ([0-9] ) .* 
 

Если у вас всегда есть пробел после первого числа, это сработает

Ответ №4:

Предполагая, что между первыми двумя числами всегда есть пробел, тогда

 preg_match('/^(d )/', $number_string, $matches);
$number = $matches[1]; // 100
 

Но для чего-то подобного вам было бы лучше использовать простые строковые операции:

 $space_pos = strpos($number_string, ' ');
$number = substr($number_string, 0, $space_pos);
 

Регулярные выражения требуют больших вычислительных затрат, и их следует избегать, если это возможно.

Комментарии:

1. Этот синтаксис Java кажется мне странным. Пожалуйста, включите ссылки на документацию Java для меня.

Ответ №5:

приведенный ниже код сделает свое дело.

 Integer num = Integer.parseInt("100 2011-10-20 14:28:55");
 

Комментарии:

1. 1 в ожидании, если строка всегда начинается с цифры… Кроме того, это Integer.parseInt() 🙂

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

3. В этом случае генерируется исключение NumberFormatException.

4. Согласно документам: The characters in the string must all be decimal digits, except that the first character may be an ASCII minus sign '-' ('u002D') to indicate a negative value or an ASCII plus sign ' ' ('u002B') to indicate a positive value

Ответ №6:

[0-9] означает, что числа 0-9 могут использоваться означает 1 или более раз. если вы используете [0-9]{3}, вы получите 3 числа

Ответ №7:

Попробуйте ^(?'num'[0-9] ).*$ , что заставляет его начинаться с самого начала, считывать число, сохранять его в ‘num’ и использовать остаток без привязки.

Ответ №8:

Это расширение строки работает отлично, даже если строка не начинается с числа. возвращайте 1234 в каждом случае — «1234asdfwewf», «%sdfsr1234» «## # 1234»

     public static string GetFirstNumber(this string source)
    {
        if (string.IsNullOrEmpty(source) == false)
        {
            // take non digits from string start
            string notNumber = new string(source.TakeWhile(c => Char.IsDigit(c) == false).ToArray());

            if (string.IsNullOrEmpty(notNumber) == false)
            {
                //replace non digit chars from string start
                source = source.Replace(notNumber, string.Empty);
            }

            //take digits from string start
            source = new string(source.TakeWhile(char.IsDigit).ToArray());
        }
        return source;
    }
 

Комментарии:

1. это не java, почему это здесь?

Ответ №9:

ПРИМЕЧАНИЕ: В Java, когда вы определяете шаблоны как строковые литералы, не забудьте использовать двойные обратные косые черты для определения регулярного выражения, экранирующего обратную косую черту ( . = "\." ) .

Чтобы получить число, которое появляется в начале или начале строки, вы можете рассмотреть возможность использования

 ^[0-9]*.?[0-9]        # Float or integer, leading digit may be missing (e.g, .35)
^-?[0-9]*.?[0-9]      # Optional - before number (e.g. -.55, -100)
^[- ]?[0-9]*.?[0-9]   # Optional   or - before number (e.g. -3.5,  30)
 

Посмотрите эту демонстрацию регулярных выражений.

Если вы хотите также сопоставить числа с научными обозначениями в начале строки, используйте

 ^[0-9]*.?[0-9] ([eE][ -]?[0-9] )?        # Just number
^-?[0-9]*.?[0-9] ([eE][ -]?[0-9] )?      # Number with an optional -
^[- ]?[0-9]*.?[0-9] ([eE][ -]?[0-9] )?   # Number with an optional - or   
 

Посмотрите эту демонстрацию регулярных выражений.

Чтобы убедиться, что справа нет другой цифры, добавьте b границу слова (?!d) или (?!.?d) отрицательный прогноз or, который не будет соответствовать, если справа есть какая-либо цифра (или . и цифра).

Ответ №10:

 public static void main(String []args){
        Scanner s=new Scanner(System.in);
        String str=s.nextLine();
        Pattern p=Pattern.compile("[0-9] ");
        Matcher m=p.matcher(str);
        while(m.find()){
            System.out.println(m.group() " ");

        }
 

Ответ №11:

d

d обозначает любое десятичное число, а расширяет его до любого другого десятичного числа, следующего непосредственно за ним, пока не появится нечисловой символ, такой как пробел или буква