У меня есть строка, из которой числа извлекаются в конце строки с регулярным выражением.
Нить:
'0 ДБ'!$B$460
подстрока:
460
Я решаю это следующим образом:
String str = "'0 DB'!$B$460";
String sStr = str.replaceAll(".*?([0-9]+)$", "$1");
Ссылка на старый вопрос: Есть ли способ узнать, сколько цифр в конце строки, не зная точного индекса?
Теперь у меня есть строка другого типа, из которой я хочу извлечь определенные диапазоны.
Нить:
'0 ДБ'!$U$305:$AH$376
Здесь я бы выделил определенные области слева от двоеточия и справа от двоеточия.
Один раз область между знаками доллара ($) и цифрой после нее. Соответствующие области могут иметь разную длину. Часть перед первым знаком доллара может состоять как из букв, так и из цифр.
Так что это будет 4 подстроки.
подстроки:
1: У
2: 305
3: АХ
4: 376
Я тоже думал решить это с помощью регулярных выражений. Но, к сожалению, мои познания в этом отношении ограничены.
Кто-нибудь знает, как я могу решить это с помощью регулярных выражений? Или есть другие способы?
Спасибо
Для этого требования вы можете просто использовать регулярное выражение, (?<=\\$)\\w+
что означает один или несколько словесных символов , которым предшествует$
.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String str = "'0 DB'!$U$305:$AH$376";
Matcher matcher = Pattern.compile("(?<=\\$)\\w+").matcher(str);
while (matcher.find()) {
System.out.println(matcher.group());
}
}
}
Выход:
U
305
AH
376
Другой вариант — использовать определенный шаблон, чтобы получить 4 части в виде групп захвата.
^.*?([A-Z])\$(\d+):\$([A-Z]+)\$(\d+)$
Объяснение
^
Начало строки.*?
Соответствует любому символу, кроме новой строки, 0+ раз нежадным способом([A-Z])\$
Захватите персонажа от A до Z в группе 1 и сопоставьте $
(\d+):\$
Захватите 1+ цифр из группы 2 и сопоставьте :$
([A-Z]+)\$
Захватите 1+ символов от A до Z в группе 1 и сопоставьте $
(\d+)
Сопоставьте 1+ цифры в группе 4$
Конец строкиДемонстрация регулярных выражений | Демонстрация Java
Пример кода
String regex = "^.*?([A-Z])\\$(\\d+):\\$([A-Z]+)\\$(\\d+)$";
String string = "'0 DB'!$U$305:$AH$376";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println(matcher.group(i));
}
}
Чтобы также соответствовать обеим строкам примера, вы можете сделать вторую часть необязательной.
^.*?([A-Z])\$(\d+)(?::\$([A-Z]+)\$(\d+))?$
Посмотрите еще одну демонстрацию регулярного выражения
Вы можете использовать 4 группы захвата
^.*?([A-Z])\$(\d+):\$([A-Z]+)\$(\d+)$
regex101.com/r/SHMmlM/1 Или части для обеих строк^.*?([A-Z])\$(\d+)(?::\$([A-Z]+)\$(\d+))?$
regex101.com/r/r5gVSC/1