2

我有一个 Java 字符串"test/this/string",我想"string/this/test"使用正则表达式或最有效的 Java 算法来反转它。我知道的方法是使用 split 方法,遍历数组并手动重建字符串。“/”的数量可以变化,并且不会出现固定的次数。有任何想法吗?

4

3 回答 3

1

这是一个想法,使用lastIndexOf()

String str = "string/this/test";

StringBuilder rev = new StringBuilder(str.length());

int start = str.lastIndexOf('/'), end = str.length();

while (start >= 0) {
    rev.append(str.substring(start + 1, end));
    rev.append('/');

    end = start;
    start = str.lastIndexOf('/', start - 1);
}

rev.append(str.substring(0, end));

System.out.println(rev);
测试/这个/字符串
于 2013-09-28T00:02:59.757 回答
1

这可以使用正则表达式在一行中完成:

String reversed = str.replaceAll("(.*?)(/.*?)?(/.*?)?(/.*?)?(/.*?)?(/.*?)?(/.*?)?(/.*?)?(/.*?)?", "$9$8$7$6$5$4$3$2$1").replaceAll("^/", "");;

其工作方式是正则表达式匹配整个字符串并将部分捕获为单独的组,然后替换字符串返回引用那些捕获的组以将它们以相反的顺序放回。

这适用于 1-9 个部分。

于 2013-09-28T00:17:59.073 回答
1

这是我的看法:

String input = "test/this/string";
List<String> list = Arrays.asList(input.split("(?=/)|(?<=/)"));
Collections.reverse(list);
StringBuilder sb = new StringBuilder();
for (String s: list)
   sb.append(s);
System.out.println(sb.toString());

(?<=/)是一个零长度匹配正则表达式,如果前一个字符是 a 则匹配/
(?=/)是一个零长度匹配正则表达式,如果下一个字符是 a 则匹配/

所以(?=/)|(?<=/)在 each 之前和之后匹配/,因此split将字符串拆分为"test", "/", "this", "/", "string".

测试

于 2013-09-28T00:18:14.200 回答