2014-02-19 3 views
0

У меня есть строка, которая является адресом URL для определенного файла. Строка выглядит следующим образом:Нужно ли регулярное выражение для извлечения подстроки String строки

abc://axs/abc/def/gh/ij/kl/mn/src/main/resources/xx.xml 

Я хочу, чтобы получить содержание после п вхождения символа /. Например, из приведенных выше строк, я хочу:

mn/src/main/resources 

Содержания появляется после того, как 8 вхождений /, и до последнего появления /. Я провел несколько примеров, таких как X{n} в регулярных выражениях, где n вхождения X будут получены и заданы с использованием group(), но в моем случае символ / будет случайным и должен получить контент.

+3

Не используйте * регулярное выражение * для извлечения информации из URL, поэтому существует класс [ 'URL'] (http://docs.oracle.com/javase/7 /docs/api/java/net/URL.html) – Maroun

+0

@MarounMaroun Если песочный хочет текст после некоторого фиксированного количества вхождений, поможет ли URL-класс? Достаточно легко перейти к разделу 'axs/abc/def/gh/ij/kl/mn/src/main/resources/xx.xml', но если это нужно разбить где-то посередине, как URL поможет? –

+0

Методы в URL-адресе не удовлетворяют моему требованию, указанному выше .. – sandy

ответ

0

Шаблон, как это захватывает все, после восьмую косую черту вплоть до конечных косых черт, как групповой номер один:

(?:[^/]*/){8}(.*)/[^/]* 

(?:[^/]*/) представляет собой последовательность из нуля или более без следов, за которым следует одна косая черта. (?:…) - группа, не связанная с захватом, так как мы не заботимся об этом тексте. {8} означает получить восемь из них (так, что мы видели восемь слэшей). (.*) передает остальную часть текста в группу, вплоть до /[^/]* (последняя косая черта и все после нее). Например:

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

public class NSlashes { 
    public static void main(String[] args) { 
     String string = "abc://axs/abc/def/gh/ij/kl/mn/src/main/resources/xx.xml"; 
     Matcher m = Pattern.compile("(?:[^/]*/){8}(.*)/[^/]*").matcher(string); 
     if (m.matches()) { 
      String result = m.group(1); 
      System.out.println("result: '"+result+"'"); 
     } 
    } 
} 
result: 'mn/src/main/resources' 
+0

Спасибо .. Очень хороший пример с объяснением – sandy

+0

Я хочу заменить ij/kl/mn некоторым текстом, скажем, «заменить». Как я могу это сделать с помощью регулярных выражений в java?Предположим, что текст, который должен быть заменен, происходит после n вхождений и до m вхождений '/' – sandy

+0

@sandy Хотя это определенно связано, это звучит как другой вопрос. Если на этот вопрос уже не ответил какой-либо вопрос на сайте, было бы, вероятно, лучше спросить его как о подлинно _new_ вопросе, с некоторыми примерами ввода, которые у вас есть, и вывода, который вы хотите. –

3

Регулярное выражение ".+://(?:[^/]+/){6}(.*)/[^/]*" будет возвращать mn/src/main/resources как группы (1) для abc://axs/abc/def/gh/ij/kl/mn/src/main/resources/xx.xml

Это можно интерпретировать как

  • По крайней мере, один символ с последующим двоеточием следуют две косой черты
  • Многие не- косые черты, сопровождаемые косой чертой (повторяется 6 раз как группа, не участвующая в сборе)
  • Группа жадных захватов
  • косая черта с последующими многими не-косыми чертами
Смежные вопросы