拆分字符串并保留字符(正则表达式)

时间:2015-10-07 20:05:17

标签: java regex string split

我想在正则表达式模式上拆分String和绝望。

我需要将像这样的字符串:Hi I want "to split" this (String)拆分为这样的String数组:

String [] array = {"Hi", "I", "want", """, "to", "split", """, "this", "(", "string", ")"};

这是我尝试过的,但它删除了分隔符。

public static void main(String[] args) {

    String string = "Hi \"why should\" (this work)";

    String[] array;
    array = string.split("\\s"
            + "|\\s(?=\")"
            + "|\\w(?=\")"
            + "|\"(?=\\w)"
            + "|\\s(?=\\()"
            + "|\\w(?=\\))"
            + "|\\((?=\\w)");

    for (String str : array) {
        System.out.println(str);
    }
}

结果:

Hi

why
shoul
"

this
wor
)

2 个答案:

答案 0 :(得分:0)

您可以将令牌与正则表达式B进行匹配,假设您希望标点符号以不同的标记结束:

\w+|[\w\s]

输出ArrayList包含:

String input = "Hi I want \"to split\" this (String).";

Matcher matcher = Pattern.compile("\\w+|[^\\w\\s]").matcher(input);
List<String> out = new ArrayList<>();

while (matcher.find()) {
    out.add(matcher.group());
}

您可能希望使用[Hi, I, want, ", to, split, ", this, (, String, ), .] 标志使(?U)\w遵循Unicode和空白字符的Unicode定义。默认情况下,\s\w仅识别ASCII范围内的单词和空白字符。

为了完整起见,这里是\s中的解决方案,它适用于Java 8及更高版本。 Java 7中的开头会有一个额外的空字符串。

split()

正则表达式相当复杂,因为空字符串在标点字符和单词字符之间拆分需要避免已经被String tokens[] = input.split("\\s+|(?<![\\w\\s])(?=\\w)|(?<=\\w)(?![\\w\\s])|(?<=[^\\w\\s])(?=[^\\w\\s])"); 拆分的情况。

由于拆分解决方案中的正则表达式非常混乱,请使用匹配解决方案

答案 1 :(得分:-1)

你想用什么语言写这个?

您可以编写正则表达式组,例如:(。+)(\ s)

这将匹配任意数量的字符,后跟空格