Как использовать регулярное выражение Java, чтобы соответствовать строке - PullRequest
20 голосов
/ 26 мая 2011

Необработанные данные:

auser1 home1b
auser2 home2b
auser3 home3b

Я хочу сопоставить строку, но она не работает при использовании ^(.*?)$

Однако я могу использовать a(.*?)b для соответствия user1 home1.

Как я могу соответствовать auser1 home1b

Ответы [ 2 ]

54 голосов
/ 26 мая 2011

По умолчанию ^ и $ соответствуют началу и концу ввода соответственно.Вам нужно включить режим MULTI-LINE с помощью (?m), в результате чего ^ и $ будут соответствовать началу и концу строки:

(?m)^.*$

Демонстрация:

import java.util.regex.*;

public class Main {
    public static void main(String[] args) throws Exception {

        String text = "auser1 home1b\n" +
                "auser2 home2b\n" +
                "auser3 home3b";

        Matcher m = Pattern.compile("(?m)^.*$").matcher(text);

        while (m.find()) {
            System.out.println("line = " + m.group());
        }
    }
}

производит следующий вывод:

line = auser1 home1b
line = auser2 home2b
line = auser3 home3b

РЕДАКТИРОВАТЬ I

Тот факт, что ^.*$ ничего не соответствует, потому что . по умолчанию не 't совпадают \r и \n.Если вы включите DOT-ALL с помощью (?s), в результате чего . также совпадет с ними, вы увидите, что вся входная строка соответствует:

(?s)^.*$

EDIT II

В этом случае, вы также можете сбросить ^ и $ и просто искать шаблон .*.Поскольку . не будет совпадать с \n, вы получите те же совпадения при поиске (?m)^.*$, что и @Kobi справедливо упоминается в комментариях.

1 голос
/ 21 августа 2018

мы также можем использовать флаг MULTILINE,

 Matcher m = Pattern.compile("^.*$",Pattern.MULTILINE).matcher(text);

Это включит многострочный режим, который даст вам ожидаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...