如何在java中的括号上拆分字符串,除了在单词中出现的字符串

时间:2016-04-23 09:13:35

标签: java

我的字符串例如是:

(我的Na(#me是Sameer)

我希望输出在括号中分割为:

钠(#me

萨米尔

4 个答案:

答案 0 :(得分:1)

我会通过使用任何空格字符作为分隔符(即" \t\r\n")来启动。

    String challenge = "(My Na(me is Sameer)";
    String[] parts = challenge.split("\\s*");

但是多个连续的空格也被处理为1个分隔符。只要有2个连续的空格,你就不希望有一个空字符串(即"")。

接下来,我将把所有内容都放在List中。首先,因为我的印象是,实际上你不只是想打印这个文本。您可能希望在代码中的其他位置使用它们,例如将它们作为参数传递给另一个方法。

有多种列表类型可供选择(例如ArrayList)。在这种情况下,我需要对列表的内容进行一次修改。我打算分割元素,如果它们以括号开头或结尾 ()。出于这个原因,我正在使用LinkedList。因为链表更有效,可以在列表中间插入元素。

    List<String> partList = new LinkedList<>(Arrays.asList(parts));

所以我们走吧,让我们迭代所有元素。如果元素以括号开头,则将其拆分为2个元素。对于以括号结尾相同的元素。

    for (int i = 0; i < partList.size(); i++) {
        String part = partList.get(i);
        if (part.startsWith("(")) {
            partList.set(i, part.substring(1));
            partList.add(i, "(");
        } else if (part.endsWith(")")) {
            partList.set(i, part.substring(0, part.length() - 1));
            partList.add(i + 1, ")");
            i++;
        }
    }

现在,请注意我在添加")"元素时递增索引,这是避免无限循环所必需的。

此方法存在缺点。如果您有一个如下所示的短语:"(((mytext)))"它可能无法满足您的期望。但我认为这超出了你的问题的范围。它可以通过添加更多代码来解决,但我不想让它太复杂。

最后我打印了所有内容。

    for (String part : partList) {
        System.out.println(part);
    }

编辑:

为了完成。以下实现稍微复杂一些,但也解决了极端情况。

    String challenge = "((this is a) rea(lly go)od (((challenge))))";
    String[] parts = challenge.split("\\s");
    List<String> partList = new LinkedList<>(Arrays.asList(parts));

    for (int i = 0; i < partList.size(); i++) {
        String part = partList.get(i);

        // avoid eternal loops
        if (part.length() == 1) continue;

        if (part.startsWith("(")) {
            partList.set(i, part.substring(1));
            partList.add(i, "(");

            // will reprocess, because the part is automatically shifted 1 position in the list.
        }
        else if (part.endsWith(")")) {
            partList.set(i, part.substring(0, part.length() - 1));
            partList.add(i+1, ")");

            // reprocess this element, there could be more ")" braces.
            i--;
        }
    }

答案 1 :(得分:0)

如果你正在寻求帮助,你应该想出你到目前为止所尝试的内容。在这里你可以做以下事情。

  1. 按空格分割原始字符串。
  2. 然后您可以迭代生成的子字符串并检查子字符串是否包含子字符串的开头或结尾。如果是这样,你可以用括号再次拆分它们。

答案 2 :(得分:0)

如果括号仅出现在句子的开头和结尾,则首先使用子字符串然后使用空格将其拆分。

如果括号可以出现在句子中间的任何位置(单词的开头或结尾),那么首先根据空格填充,然后遍历每个单词并根据括号的开头和结尾再次溢出字。您可以使用以下代码(当然,这可以进一步增强)

String test = "(My Na(me (is) Jack)";
String[] splitWords = test.split(" ");
for (String word : splitWords) {
    int size = word.length();
    if (word.startsWith("(") && word.endsWith(")")) {
        System.out.println("(");
        System.out.println(word.substring(1, size - 1));
        System.out.println(")");
    } else if (word.startsWith("(") && !word.endsWith(")")) {
        System.out.println("(");
        System.out.println(word.substring(1, size ));
    } else if (!word.startsWith("(") && word.endsWith(")")) {
        System.out.println(word.substring(0, size - 1));
        System.out.println(")");
    } else {
        System.out.println(word);
    }
}

这将产生如下输出。

(
My
Na(me
(
is
)
Jack
)

答案 3 :(得分:0)

此正则表达式仅匹配您想要的括号:\B[)(]\b|\b[)(]\B|\B[)(]\B

这里是一个Java字符串:

"\\B[)(]\\b|\\b[)(]\\B|\\B[)(]\\B"

\b匹配字边界

\B匹配非字边界