#java #regex
#java #регулярное выражение
Вопрос:
Я пытаюсь перенести содержимое между входными данными, мой шаблон не работает правильно, пожалуйста, помогите.
ниже приведен sudocode:
s="Input one Input Two Input Three";
Pattern pat = Pattern.compile("Input(.*?)");
Matcher m = pat.matcher(s);
if m.matches():
print m.group(..)
Требуемый вывод:
один
Два
Три
Комментарии:
1. Почему оно не может делать правильные вещи? Что вы получаете?
2. Будут ли части между «вводом» всегда состоять из отдельных слов?
Ответ №1:
Используйте предварительный просмотр для Input
и используйте find
в цикле вместо matches
:
Pattern pattern = Pattern.compile("Input(.*?)(?=Input|$)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
Посмотрите, как это работает онлайн: ideone
Но здесь лучше использовать split:
String[] result = s.split("Input");
// You need to ignore the first element in result, because it is empty.
Посмотрите, как это работает онлайн: ideone
Комментарии:
1. Мне нравится разделенное решение, но я бы добавил пробел, чтобы оно было s.split(«Ввод»).
2. Упс. Почти. Использование s.split(» ?Ввод») также позволило бы использовать пробел после каждого слова.
Ответ №2:
это не работает, потому что m.matches имеет значение true тогда и только тогда, когда выражение соответствует всей строке. Вы могли бы пойти двумя путями:
- Вместо этого используйте s.split(«Ввод»), это дает вам массив подстрок между вхождениями «Ввода»
- Используйте Matcher.find() и Matcher.group(int). Но имейте в виду, что ваше текущее выражение будет соответствовать всему после первого появления «Ввода», поэтому вам следует изменить свое выражение.
Приветствую, Йост
Ответ №3:
import java.util.regex.*;
public class Regex {
public static void main(String[] args) {
String s="Input one Input Two Input Three";
Pattern pat = Pattern.compile("(Input) (\w )");
Matcher m = pat.matcher(s);
while( m.find() ) {
System.out.println( m.group(2) );
}
}
}