2013-09-04 1 views
0

Я использую класс Matcher Java для получения некоторых строк, теперь, когда я получаю свои совпадения, я также нахожу их индекс начала и конца индекса. Теперь, что я хочу сделать, это получить символы x предшествующих и последующих символов.Получение «контекстного» текста сопоставленной группы

Так что я просто вызвать метод подстроки на строку с {begin index minusх} в {end index plusх}, но это, кажется, немного тяжелым, на каждый матч, я должен буду петле строка для контекста.

Я хотел знать, есть ли лучший способ сделать это.

Вот что я сделал до сих пор: Та часть, которая беспокоит меня является text.substring, как дорого это

String text = "Some 22 text with 44 characters"; 
    Matcher matcher = Pattern.compile("\\d{2}").matcher(text); 
    int x = 5; 
    while (matcher.find()) { 
     String match = matcher.group(); 
     int start = matcher.start(); 
     int end = matcher.end(); 
     String pretext = text.substring(start - x, start); 
     String postext = text.substring(end, end + x); 
     System.out.println(pretext + " - " + match + " - " + postext); 
    } 

Отдается ответ с помощью группирования, чтобы решить эту проблему: с помощью regex (.{5})(\d{2}(.{5}). Прежде всего, это не удалось бы захватить не более 5 символов. Таким образом, решение это (.{0,5})(\d{2})(.{0.5}), очень хорошо для этого простого регулярного выражения (\d{2}) но для того, как «c?at» и данный текст «кот» это будет соответствовать группам

  1. гр
  2. на
  3.  
+0

Показать код. Трудно ответить на вопросы, не видя, что вы на самом деле пробовали. – user2339071

+0

является вашим 'x' фиксированным или переменным? – collapsar

+0

Я добавил то, что я сделал, и да x - фиксированная переменная – aclokay

ответ

0
String text = "Some 22 text with 44 characters"; 
Matcher matcher = Pattern.compile("(.{5})(\\d{2})(.{5})").matcher(text); 

while (matcher.find()) { 
    System.out.println(matcher.group(1) + " - " + matcher.group(2) + " - " + matcher.group(3)); 
} 

выход:

Some - 22 - text 
with - 44 - char 
+0

Это хорошо для простого регулярного выражения, но тот, который включает в себя необязательные символы, не будет работать с этим. Я приведу пример в самой записи – aclokay

+0

«Прежде всего, это не сможет захватить те, у которых не должно быть не менее 5 символов до». Но вы сказали, что 5 является фиксированным. {0,5} означает 0, 1,2,3,4,5 символов будут сопоставлены –

+0

Также я не понял этого предложения: «очень хорошо для этого простого регулярного выражения (\ d {2}), но для одного типа« c? At »и данного текста «кошка» это будет соответствовать группам c по адресу 3. " –

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

  • Нет связанных вопросов^_^