2015-01-14 3 views
0

Я хочу создать регулярное выражение, чтобы соответствовать всем элементам в следующей строке:Добавить регулярное выражение соответствует вместе

11 jan. 22:20 - Dam: Ik zal d'r zijn 

Я хочу, чтобы соответствовать дате, время, имя (Dam) и сообщение.

В настоящее время у меня есть следующие: регулярные выражения

checks date: [1-31 a-z] 
checks message: ([^:]+)(.*)$ 
checks time: (([0-1]?[0-9]|2[0-3]):[0-5][0-9]) 
checks name: (?:\s[^:-]+) 

Как наклеить их вместе? Я хочу, чтобы использовать его как это:

String date = matcher.group(1); 
Time time = new Time(matcher.group(2)); 
String name = matcher.group(3); 
Message message = new Message(matcher.group(4)); 
Chat chat = new Chat(date,time,name,message); 

Кроме того, название не только соответствует значению, после - \ х лет, а также сообщений и части времени.

+0

На какой платформе вы развивающуюся? Выглядит скорее Java 7, но хочу быть уверенным. – adamdc78

+0

Java 7 это! :) – bdv

ответ

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

public class HelloWorld { 
    public static void main(String[] args) { 
    Pattern p = Pattern.compile("(\\d{1,2}\\s[a-z]{3})\\.?\\s(\\d{1,2}:\\d{1,2})\\s-\\s([a-z]+):\\s(.+)", Pattern.CASE_INSENSITIVE); 
    Matcher m = p.matcher("11 jan. 22:20 - Dam: Ik zal d'r zijn"); 

    while (m.find()) 
    { 
     for (int i=1; i <= m.groupCount(); ++i) 
     System.out.println("group " + i + ": " + m.group(i)); 
    } 
    } 
} 

Выход:

группа 1: 11 января
группа 2: 22:20
группа 3: плотина
группа 4: Ик Zal d'г Zijn

Примечание от API:

По умолчанию нечувствительность к регистру допускает, что только символы в сопоставляются кодировкой US-ASCII. Unicode-case -чувствительность без учета регистра совпадение может быть включено путем указания флага UNICODE_CASE в , связанного с этим флагом.

Возможно, вы захотите запечатлеть период после имени месяца, и в этом случае вы переместили бы закрывающий круглый кронштейн. Вы также можете указать не-альфа-символы в именах, если это так, обновите класс символов ([a-z]+).

Ссылки: Regex101, RegexPlanet Java (вам необходимо вручную проверить флаг CASE_INSENSITIVE, следуя этой ссылке, не зная, почему они не сохраняют их в ссылке общего доступа).

+0

Ницца! Почему/i, а не/g? Также, как мне группировать 1 и 2? – bdv

+0

Я также получаю много ошибок обхода btw, везде \ используется. – bdv

+0

i нечувствителен к регистру. Если вы используете журналы, вы также хотите включить g. Круглые скобки - это границы групповых совпадений, поэтому просто вынимайте закрывающий кронштейн первого и открывающий кронштейн второго, чтобы объединить их. – adamdc78

0

Вот регулярное выражение строка

([\\w\\s]+)([\\s\\.]*)([\\d:]+)([\\s\\-]*)([\\w]+)([\\s:]*)([\\s\\S]*) 

Обновление регулярное выражение

([\w\s]+)(?:[\s\.]*)([\d:]+)(?:[\s\-]*)([\w]+)(?:[\s:]*)([\s\S]*) 

Проверить эту ссылку из https://regex101.com/r/cP8cU9/2

Тест:

Pattern pattern = Pattern 
     .compile("([\\w\\s]+)(?:[\\s\\.]*)([\\d:]+)(?:[\\s\\-]*)([\\w]+)(?:[\\s:]*)([\\s\\S]*)"); 
Matcher matcher = pattern 
     .matcher("11 jan. 22:20 - Dam: Ik zal d'r zijn"); 
while (matcher.find()) { 
    System.out.println(String.format("Date: %s", matcher.group(1))); 
    System.out.println(String.format("Time: %s", matcher.group(2))); 
    System.out.println(String.format("Name: %s", matcher.group(3))); 
    System.out.println(String.format("Message: %s", matcher.group(4))); 
} 

Или вы можете сделать петлю т получить данные о

while (matcher.find()) { 
    int groupCnt = matcher.groupCount(); 
    for (int i = 1; i <= groupCnt; i++) { 
     System.out.println(matcher.group(i)); 
    } 
} 

Проверить эту ссылку из: https://regex101.com/r/cP8cU9/1 знать, как получить указать группу.(Посмотрите на правой боковой панели)

Результат:

Date: 11 jan 
Message: Ik zal d'r zijn 
Time: 22:20 
Name: Dam 
+0

Измените строку ввода на 'a1 jan. 22:20 - Плотина: Ik zal d'r zijn', и ваше регулярное выражение даст ложный результат на дату. – adamdc78

+0

Спасибо за ваш ответ. Джек, однако, поскольку я использую несколько регулярных выражений в моем коде, matcher.group() должен рассчитывать от 1 до 4 вместо того, чтобы делать прыжки. – bdv

+0

Это очень легко редактировать, вы просто добавляете?: Группировать, что вы не хотите его принимать. Просмотреть мое обновление – Luc

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