#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
обозначает любое десятичное число, а
расширяет его до любого другого десятичного числа, следующего непосредственно за ним, пока не появится нечисловой символ, такой как пробел или буква