需要正则表达式来提取字符串的子字符串

时间:2014-02-19 16:13:10

标签: java

我有一个字符串,它是特定文件的URL位置。字符串看起来像:

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

我希望在 n 出现字符/后获取内容。例如,从上面的字符串,我想:

mn/src/main/resources

内容出现在/的8次出现之后,以及/的最后一次出现之前。我在正则表达式中经历了一些例如X{n}的示例,其中{em> n 的X出现将被检索并使用group()给出,但在我的情况下是字符{ {1}}是随机的,需要获取内容。

2 个答案:

答案 0 :(得分:3)

正则表达式".+://(?:[^/]+/){6}(.*)/[^/]*"mn/src/main/resources作为{1}}

的组(1)返回abc://axs/abc/def/gh/ij/kl/mn/src/main/resources/xx.xml

可以解释为

  • 至少有一个字符后跟冒号后跟两个斜杠
  • 许多非斜杠后跟斜线(作为非捕获组重复6次)
  • 贪婪的捕获组
  • 斜线后跟许多非斜杠

答案 1 :(得分: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'