2016-11-23 3 views
-1

У меня есть строка, как нижеJava - Разбивает строку по регулярному выражению

[timestamp] [ABC_DEF] this is message.

В Java, я должен разделить выше строку и получить только this is message.

Я попытался разбить его, получая LastIndexOf ], а затем подстрокой. Но это не правильный подход для моего случая использования, потому что мое сообщение может содержать ], и все идет не так.

Итак, я хотел сделать это с помощью регулярного выражения.

В регулярном выражении я хочу совместить [timestamp] [ABC_DEF]. Тимэксперт может быть любым, но он должен соответствовать [ABC_DEF]. Только тогда я должен получить свое сообщение.

Любые предложения в письменном виде для того же или любого другого, если вы предлагаете какой-либо другой подход, также подходят для меня.

Спасибо.

+2

Соответствие буквального '[ABC_DEF]' не кажется таким трудным, не так ли? Вы хотите попробовать? – Henry

+0

Да, это то, что вы написали в своем вопросе. Попробуйте, мы поможем вам, если вы не сможете сделать это самостоятельно. – Thomas

+0

Re: 'lastIndexOf': почему бы не использовать' indexOf' (дважды)? – Thomas

ответ

1

С помощью всего String методов:

String filter = "[ABC_DEF]"; 
int filterIndex = line.indexOf(filter); 
if (filterIndex >= 0) { 
    return line.substring(filterIndex + filter.length()).trim(); 
} 

Здесь вы проверить, является ли строка [ABC_DEF] содержится в line и если да, в какой позиции в строке. Затем вы перепрыгиваете через это событие, добавляя длину [ABC_DEF] к индексу, в котором он был найден. Остальная часть строки - это сообщение, и ее извлекают с использованием метода substring. Наконец, ненужные пробелы усекаются с trim().


С регулярными выражениями:

String filter = "\\[ABC_DEF\\]"; // note the backslashs 
Pattern pattern = Pattern.compile("^\\[[^]]*\\]\\s+" + filter + "\\s*(.*)$"); 
Matcher matcher = pattern.match(line); 
if (matcher.matches()) { 
    return matcher.group(1).trim(); 
} 

Во-первых, вы компилировать регулярное выражение, которое должно соответствовать line. (При проверке нескольких строк определение Pattern должно выполняться только один раз.) Поскольку [ и ] являются символами, которые имеют особое значение в регулярных выражениях, мы должны избегать их с обратными слэшами при их включении в регулярное выражение. Часть сообщения строки фиксируется между ( и ), так что - в случае соответствия выражения - мы можем легко извлечь часть сообщения с помощью метода group. Как и в случае выше, мы удаляем ненужные пробелы в начале и в конце сообщения с trim().

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