2012-02-16 6 views
0

Как написать регулярное выражение, которое будет соответствовать многострочному описанию новой строки и пробелов?java regex строки соответствия и многострочные разделители с новой строкой

Следующий код работает для одного многострочных, но не работает, если вход является

String input = "A1234567890\nAAAAA\nwwwwwwww"

я имею в виду matches() не верен для входа.

Вот мой код:

package patternreg; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class pattrenmatching { 
    public static void main(String[] args) { 

    String input = "A1234567890\nAAAAA"; 
    String regex = ".*[\\w\\s\\w+].*"; 
    Pattern p = Pattern.compile(regex,Pattern.MULTILINE); 
    Matcher m =p.matcher(input); 

      if (m.matches()) { 
     System.out.println("matches() found the pattern \"" 
      + "\" starting at index " 
      + " and ending at index "); 
    } else { 
     System.out.println("matches() found nothing"); 
    } 
    } 
} 
+0

выглядит, как это работает! дать более конкретную информацию, что происходит? что должно произойти? – Bhushan

+0

Привет, Bhushan, совпадения должны возвращать совпадения, найденные в шаблоне, даже если ввод ограничивается символом newline, если вход имеет несколько строк новой строки A1234567890 \ nAAAAA \ ndddd \ ndddd \ nddd, совпадения возвращают соответствия() ничего не найдено " – user1182067

+0

i скопировано и вставлено ваш код и выполнен, я получил этот результат: A1234567890 AAAAA * matches() нашел шаблон «", начинающийся с индекса и заканчивающийся индексом – Bhushan

ответ

0

Я считаю, что ваша проблема в том, что * жаден, так что это соответствие все остальные «\ п» в строке..

Если вы хотите придерживаться вышеуказанного кода, попробуйте: «[\ S] * [\ s] +". Это означает совпадение нуля или нескольких символов без пробелов, за которыми следует один или несколько символов пробелов.

устроились код:

public static void main(String[] args) { 

    String input = "A1234567890\nAAAAA\nsdfasdf\nasdfasdf"; 
    String regex = "[\\S]*[\\s]+"; 
    Pattern p = Pattern.compile(regex, Pattern.MULTILINE); 

    Matcher m = p.matcher(input); 

    while (m.find()) { 

     System.out.println(input.substring(m.start(), m.end()) + "*"); 
    } 

    if (m.matches()) { 
     System.out.println("matches() found the pattern \"" + "\" starting at index " + " and ending at index "); 
    } else { 
     System.out.println("matches() found nothing"); 
    } 

} 

ВЫВОД:

A1234567890 * AAAAA * sdfasdf * спички() ничего не нашел

Кроме того, образец

"([\\S]*[\\s]+)+([\\S])*"

будет соответствовать всему выводу (согласовань возвращает истину), но портит лексемы части вашего кода.

1

Можно также добавить флаг DOTALL, чтобы получить его работу:

Pattern p = Pattern.compile(regex, Pattern.MULTILINE | Pattern.DOTALL); 
+0

Все еще совпадения не возвращают значение true, если оно ограничено новой строкой: – user1182067

+0

With String input = «A1234567890»; совпадения истинны, другие мудрые, если совпадение «A1234567890/nddd» не соответствует – user1182067

+0

Добавление флага DOTALL вместе с MULTILINE не разрешило проблему для вас? 'M.matches()' возвращает true для мне, если я скомпилирую шаблон с обоими флагами 'Pattern.MULTILINE | Pattern.DOTALL'. Я мог бы не понимать вашу проблему хотя ... –

Смежные вопросы