如何使用“%*%”作为分隔符在Java中拆分字符串,包括字符串结果列表中的分隔符?

时间:2012-12-26 03:29:56

标签: java regex

我正在寻找标记字符串的最简单方法,例如

       INPUT                       OUTPUT
"hello %my% world" -> "hello ", "%my%", " world"
在Java中

。用正则表达式可以实现这个目的吗?我基本上是在寻找一个String.split(),它将“%*%”作为分隔符,但不会忽略它,因为它似乎通常会这样做。

由于

4 个答案:

答案 0 :(得分:3)

不,你不能按照解释的方式做到这一点。原因是 - 它含糊不清!

您举例:

“你好%我的%世界” - > “你好”,“%my%”,“世界”

%应该在它之前还是之后附加到字符串?

输出应该是

“你好”,“%my”,“%world”

或者,输出可能是

“你好%”,“我的%”,“世界”

在您的示例中,您不遵循这些规则中的任何一个。你想出了%my%,它首先将分隔符附加到出现后的字符串,然后出现之前的字符串

你看到了歧义吗?

因此,您首先需要提出一套关于您希望将分隔符附加到哪里的明确规则。一旦你这样做,一个简单的(虽然不是特别有效,因为字符串是不可变的)实现你想要的方式是:

  1. 使用String.split()以正常方式分割字符串
  2. 按照规则集将分隔符重新添加到字符串中的位置。

答案 1 :(得分:1)

更简单的解决方案是将字符串拆分为% s。这样,每个其他子序列都在%之间。之后您需要做的就是遍历结果,切换标志以了解结果是常规字符串还是%之间的结果。

必须特别注意 split 实现,它如何处理空子序列。一些实现决定在输入的开始/结束时丢弃空子序列,其他实现丢弃所有空子序列,而其他实现则不丢弃它们。

这不会产生您想要的确切输出,因为%将会消失。但是,如果确实需要它们,你可以轻松地添加它们(我认为没有)。

答案 2 :(得分:0)

为什么不用你的单词之间的空格分开。在这种情况下,你会得到“你好”,“%my%”,“世界”。

答案 3 :(得分:0)

如果可能,请使用更简单的分隔符。我可以将陪审团操纵“%”作为您的分隔符,这样您就可以获得String.split()而不是正则表达式。但如果那不可能......

Regexps!您可以使用Matcher解析此问题。如果你知道每行有一个分隔符,你可以指定一个吃掉整行的模式:

    String singleDelimRegexp = "(.*)(%[^%]*%)(.*)";
    Pattern singleDelimPattern = Pattern.compile(singleDelimRegexp);
    Matcher singleDelimMatcher = singleDelimPattern.matcher(input);

    if (singleDelimMatcher.matches()) {
        String before = singleDelimMatcher.group(1);
        String delim = singleDelimMatcher.group(2);
        String after = singleDelimMatcher.group(3);

        System.out.println(before + "//" + delim + "//" + after);
    }

如果输入很长并且您需要一系列结果,则可以在循环中使用Matcher:

String multiDelimRegexp = "%[^%]*%";
    Pattern multiDelimPattern = Pattern.compile(multiDelimRegexp);
    Matcher multiDelimMatcher = multiDelimPattern.matcher(input);

    int lastEnd = 0;
    while (multiDelimMatcher.find()) {
        String data = input.substring(lastEnd, multiDelimMatcher.start());
        String delim = multiDelimMatcher.group();
        lastEnd = multiDelimMatcher.end();
        System.out.println(data);
        System.out.println(delim);
    }
    String lastData = input.substring(lastEnd);
    System.out.println(lastData);

随着时间的推移将这些添加到数据结构中,您将构建整个解析的输入。

在输入上运行:http://ideone.com/s8FzeW