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