Вопрос-ответ

Using regular expressions to extract a value in Java

Использование регулярных выражений для извлечения значения в Java

У меня есть несколько строк в приблизительном виде:

[some text] [some number] [some more text]

Я хочу извлечь текст в [некотором количестве], используя классы регулярных выражений Java.

Я примерно знаю, какое регулярное выражение я хочу использовать (хотя все предложения приветствуются). Что меня действительно интересует, так это вызовы Java для получения строки регулярного выражения и использования ее в исходных данных для получения значения [некоторого числа].

Я должен добавить, что меня интересует только одно [некоторое число] (в основном, первый экземпляр). Исходные строки короткие, и я не собираюсь искать множественные вхождения [некоторого числа].

Переведено автоматически
Ответ 1

Полный пример:

private static final Pattern p = Pattern.compile("^([a-zA-Z]+)([0-9]+)(.*)");
public static void main(String[] args) {
// create matcher for pattern p and given string
Matcher m = p.matcher("Testing123Testing");

// if an occurrence if a pattern was found in a given string...
if (m.find()) {
// ...then you can use group() methods.
System.out.println(m.group(0)); // whole matched expression
System.out.println(m.group(1)); // first expression from round brackets (Testing)
System.out.println(m.group(2)); // second one (123)
System.out.println(m.group(3)); // third one (Testing)
}
}

Поскольку вы ищете первое число, вы можете использовать такое регулярное выражение:

^\D+(\d+).*

и m.group(1) вернет вам первое число. Обратите внимание, что числа со знаком могут содержать знак минус:

^\D+(-?\d+).*
Ответ 2
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Regex1 {
public static void main(String[]args) {
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("hello1234goodboy789very2345");
while(m.find()) {
System.out.println(m.group());
}
}
}

Вывод:

1234
789
2345
Ответ 3

У Аллена в основном есть код Java, так что вы можете его использовать. Однако его выражение совпадает только если вашим числам предшествует только поток символов word.

"(\\d+)"

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

Если вы ожидаете, что оно будет заменено пробелами, это сделает его указание еще более четким

"\\s+(\\d+)\\s+"

могло бы быть лучше.

Если вам нужны все три части, этого хватит:

"(\\D+)(\\d+)(.*)"

РЕДАКТИРОВАТЬ Выражения, приведенные Аллейном и Джеком, предполагают, что вам нужно указать некоторое подмножество нецифровых значений, чтобы получить цифры. Если вы сообщите движку регулярных выражений, что ищете \d, то он проигнорирует все, что находится перед цифрами. Если выражение J или A соответствует вашему шаблону, то полное совпадение равно входной строке. И нет причин указывать это. Это, вероятно, замедляет точное совпадение, если оно не игнорируется полностью.

Ответ 4

В дополнение к шаблону, класс Java String также имеет несколько методов, которые могут работать с регулярными выражениями, в вашем случае код будет:

"ab123abc".replaceFirst("\\D*(\\d*).*", "$1")

где \\D - нецифровый символ.

java regex