【问题标题】:Splitting query string using multiple delimiters - java使用多个分隔符拆分查询字符串 - java
【发布时间】:2015-08-25 21:38:07
【问题描述】:

我想拆分这些字符串:

  1. /d/{?a}
  2. /a/b/{c}{?d}
  3. /a/b/c{?d}

进入以下细分列表:

  1. [d, {?a}](这种情况很简单,用 / 分割即可)
  2. [a, b, {c}, {?d}]
  3. [a, b, c, {?d}]

对于其他情况,使用 / 进行拆分不会得到我想要的结果。在这种情况下,2. 和 3. 的最后一个字符串元素将是 {c}{?d} 和 c{?d}。

同时实现所有 1、2、3 的最佳方法是什么?

谢谢。

【问题讨论】:

  • 你试过什么? /a/b/c{?d 是否会被拆分为 [a, b, c{?d] (即因为缺少 })?您希望如何拆分 [a, b, c, {de{f}g}](即嵌套 {})?您是只有 {} 还是 () 或 [] 等?
  • @LuciaPasarin:谢谢你的建议。
  • 如何实现另一个这样的案例(所有其他三个案例也必须工作)? /a/b?c=123 => [a, b, c=123] 再次感谢。
  • 我明白了:正则表达式:"(/)|(?=\\{\\?)|(?

标签: java string split guava splitter


【解决方案1】:

尝试使用正则表达式解决问题。这可能是一个开始的脚本:

String regex = "(/)|(?=\\{)";
String s =  "/a/b/{c}{?d}";
String[] split = s.split(regex);

您将使用此正则表达式在拆分数组中获得空元素,但所有其他元素均被正确拆分

【讨论】:

  • 非常感谢。我认为您的解决方案很棒。
  • 如何实现另一个这样的案例(所有三个案例都必须工作)? /a/b?c=123 => [a, b, c=123] 再次感谢。
  • 我明白了:正则表达式:"(/)|(?=\\{\\?)|(?
【解决方案2】:

如果您知道您的输入总是不同于 { 和 } 或 {xyz} 的任何字符 xyz,这里有一些简单的解决方法。如果您有任何其他输入,则需要进行一些修改:

String[] arr = input.split("/");
List<String> result = new ArrayList<>();

for (String elem : arr) {
    int lastCut = 0;
    for (int i = 0; i < elem.length(); i++) {
        if (elem.charAt(i) == '{' || elem.charAt(i) == '}') {
            if (i > 0) {
                String previousElem = elem.substring(lastCut, i);
                result.add(previousElem);
            }
            lastCut = i;
        }
    }
    if (lastCut < elem.length() - 2)
    String lastElem = elem.substring(lastCut + 1, elem.length());
    result.add(lastElem);
}

【讨论】:

  • 感谢您的建议。
【解决方案3】:

在第一种情况下,它正在分裂。但在其他情况下,它正在解析。 您必须先解析一个字符串,然后再拆分它。尝试在每个“{”之前和每个“}”之后添加“/”。然后你可以用'/'分割它。 例如:

解析前:

2. /a/b/{c}{?d}
3. /a/b/c{?d}

解析后:

2. /a/b//{c}//{?d}/
3. /a/b/c/{?d}/

然后去掉多余的'/',拆分字符串,开心就好。

【讨论】:

  • 感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 2012-10-24
  • 1970-01-01
  • 2018-02-27
  • 2012-02-27
  • 1970-01-01
相关资源
最近更新 更多