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

Java 如何在两个相同的分隔符之间匹配字符串?,java,regex,Java,Regex,一些字符串测试moretext.csv 我想提取字符串test,它总是在第二个和第三个-分隔符之后找到 表达式[-](.*?[-]将匹配-string-。所以可能很接近了,但我怎样才能继续下一场比赛呢 如果这很重要,我正在使用java如果您事先知道分隔符的数量,您可以拆分字符串 String[] test = { "some-string-test-moretext.csv", "another-string-test-andthensome.csv" }; for (Str

一些字符串测试moretext.csv

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

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


如果这很重要,我正在使用
java

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

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

test
test

这将为您提供一个良好的开端:

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


我建议使用regex,非常简短:

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];
sed
中:

$ echo 'some-string-test-moretext.csv' | sed 's/[^-]*-[^-]*-\([^-]*\)-.*/\1/'
test
[^-]*
表示“除“-”之外的任何字符的出现次数为零或更多。我们称之为“notHyphen”。因此,我们正在匹配
notHyphen notHyphen-\(notHyphen\)-。
并将整个匹配替换为
\1
,即
\(\)
捕获的任何字符

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

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

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

为什么不使用string.split?有很多潜在的解决方案。你可以在
-
上拆分并选择第三个元素。你可以将indexOf和substring结合起来。你可以通过使用环视机制重写正则表达式,以避免使用
-
。但是要选择最佳的解决方案,我们需要更多地了解真实数据的外观。w您将从
--------------------------
匹配?好的,这可能是建议在这里只拆分而不使用正则表达式。@membersound
split
使用正则表达式来描述分隔符,恰好
-
不是正则表达式元字符,所以您不需要转义它。@membersound似乎是最简单、最简洁的方法是的。您可以使用模式/匹配器并进行迭代,直到获得所选的索引返回引用,但我认为这在上下文中没有用处。