如何匹配两个相同分隔符之间的字符串?

时间:2017-08-15 15:09:19

标签: java regex

some-string-test-moretext.csv

我想提取字符串test,它总是在第2个和第3个-分隔符之后找到。

表达式[-](.*?)[-]将匹配-string-。所以它可能很接近,但我怎样才能进入下一场比赛?

如果重要,我正在使用java

4 个答案:

答案 0 :(得分:4)

如果您事先知道分隔符的数量,则可以拆分String

String[] test = {
     "some-string-test-moretext.csv",
     "another-string-test-andthensome.csv"
};
for (String s: test) {
    System.out.println(s.split("-")[2]);
}

<强>输出

test
test

答案 1 :(得分:1)

这应该给你一个良好的开端:

[^-]+-[^-]+-(.*?)-[^-]+\.csv

https://regex101.com/r/YjWDkv/1

答案 2 :(得分:0)

我建议使用正则表达式,非常简短:

String str = "some-string-test-moretext.csv\n";

Matcher m = Pattern.compile("\\w+-\\w+-(\\w+).*").matcher(str);
String res = m.find() ? m.group(1) : "";

System.out.println(res);

肯定String.split()是另一种方式:

String res = str.split("-")[2];

答案 3 :(得分:0)

sed

$ echo 'some-string-test-moretext.csv' | sed 's/[^-]*-[^-]*-\([^-]*\)-.*/\1/'
test

[^-]*表示&#34;除了&#34; - &#34;之外的任何char的零次或多次出现。让我们称之为&#34; notHyphen&#34;。因此,我们会在notHyphen-notHyphen-\(notHyphen\)-.*上进行匹配,并将整个匹配项替换为\1,即\(\)捕获的内容。

在Java中,您不需要将(转义为\(,并且从捕获组中提取的技术也不同:

Pattern patt = Pattern.compile("[^-]*-[^-]*-([^-]*)-.*");

Matcher m = patt.matcher(filename);
String extracted = null;
if (m.matches()) {
    extracted = m.group(1);
}