2014-02-19 80 views
0

我有一個字符串,它是一個特定文件的URL位置。該字符串的樣子:需要正則表達式來提取字符串的子字符串

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

我想以後ñ出現的字符/的獲取內容。例如,從上面的字符串,我想:8次後出現的/

mn/src/main/resources 

的內容出現,並/末次出現之前。我經歷了幾個例子,如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雖然相關,但這聽起來像是一個不同的問題。如果它還沒有被網站上的某個問題回答,最好將它作爲一個真正的新問題,並提供一些你有的輸入和你想要的輸出的例子。 –

3

正則表達式".+://(?:[^/]+/){6}(.*)/[^/]*"將返回mn/src/main/resources爲基團(1),用於abc://axs/abc/def/gh/ij/kl/mn/src/main/resources/xx.xml

它可以解釋爲

  • 至少一個字符後面跟着冒號,然後兩個斜槓
  • 許多非斜線後跟斜線(重複6次作爲非捕捉組)
  • 貪婪捕獲組
  • 斜線後跟許多非斜線
相關問題