1

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

       INPUT                       OUTPUT
"hello %my% world" -> "hello ", "%my%", " world"

在爪哇。是否可以使用正则表达式来实现这一点?我基本上是在寻找一个 String.split() ,它将“%*%”形式的东西作​​为分隔符,但它不会像通常那样忽略它。

谢谢

4

4 回答 4

3

不,您不能按照您解释的方式执行此操作。原因是——模棱两可!

你举个例子:

“你好 %my% 世界”->“你好”、“%my%”、“世界”

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

输出应该是

“你好”、“%my”、“%world”

或者,也许输出应该是

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

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

你看到歧义了吗?

因此,您首先需要提出一套明确的规则,说明您希望将分界符附加到何处。一旦你这样做了,一种简单的(虽然不是特别有效,因为字符串是不可变的)实现你想要的方法是:

  1. 用于String.split()以正常方式拆分字符串
  2. 按照您的规则集将分隔符重新添加到它应该在字符串中的位置。
于 2012-12-26T04:07:34.680 回答
1

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

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

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

于 2012-12-26T04:14:02.760 回答
0

为什么不按单词之间的空格分开。在这种情况下,您将得到“hello”、“%my%”、“world”。

于 2012-12-26T04:11:32.227 回答
0

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

正则表达式!您可以使用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

于 2012-12-26T05:03:45.147 回答