获取字符“前两次”出现之间的子字符串

Aja*_*mar 6 java string substring java-8

我有一个String

 String thestra = "/aaa/bbb/ccc/ddd/eee";
Run Code Online (Sandbox Code Playgroud)

在我的情况下,每次刺痛,至少都会出现两次斜线。

我得到类似下面的内容,它是字符串中/aaa/字符的“前两次出现”之间的子字符串。/

 System.out.println("/" + thestra.split("\\/")[1] + "/");
Run Code Online (Sandbox Code Playgroud)

它解决了我的目的,但我想知道是否还有其他优雅且干净的替代方案?

请注意,我需要在 周围使用两个斜杠(前导和尾随)aaa。IE/aaa/

kay*_*ya3 6

您可以使用indexOf,它接受索引的第二个参数来开始搜索:

int start = thestra.indexOf("/");
int end = thestra.indexOf("/", start + 1) + 1;
System.out.println(thestra.substring(start, end));
Run Code Online (Sandbox Code Playgroud)

它是否更优雅是一个见仁见智的问题,但至少它不会找到/字符串中的每个或创建不必要的数组。


Ale*_*nko 5

Scanner::findInLine可以使用返回模式的第一个匹配项:

String thestra = "/aaa/bbb/ccc/ddd/eee";
System.out.println(new Scanner(thestra).findInLine("/[^/]*/"));
Run Code Online (Sandbox Code Playgroud)

输出:

/aaa/
Run Code Online (Sandbox Code Playgroud)

  • @AjayKumar 当然,“split”为您的任务做了很多不必要的工作。然后,您将执行字符串连接。因此,这种“Scanner”方法可能更有效,不过,“thestra.replaceFirst("[^/]*(/[^/]*/).*", "$1")`可能会更有效。在任何一种情况下,如果您多次执行此操作,则使用“Pattern.compile”一次并重新使用此对象可能会更有效。`findInLine` 支持指定准备好的 `Pattern` 而不是 `String`,对于替换优先方法,您可以直接在模式上调用 `.matcher(thestra).replaceFirst("$1")` (3认同)