【问题标题】:splitting string and keep characters (regex pattern)拆分字符串并保留字符(正则表达式模式)
【发布时间】:2015-10-07 20:05:16
【问题描述】:

我想拆分一个字符串并对正则表达式模式感到绝望。

我需要将这样的字符串:Hi I want "to split" this (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
)

【问题讨论】:

  • 到目前为止你尝试了什么?请给我们一些代码。
  • 是的,应该是java
  • @d_amiD 你可以修复Hi,I,want,",to,split,",this,(,string,) 这不好
  • 所以你想在每个空格、每个特殊字符上拆分它?你想存储特殊字符,而不是空格?
  • @Emz 是的。我想到了一些带有前瞻的东西,但这对于保留特殊字符不起作用

标签: java regex string split


【解决方案1】:

您可以将标记与正则表达式 \w+|[\w\s] 匹配,假设您希望标点符号以不同的标记结束:

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());
}

输出的 ArrayList 包含:

[Hi, I, want, ", to, split, ", this, (, String, ), .]

您可能希望使用(?U) 标志使\w\s 遵循单词和空白字符的Unicode 定义。默认情况下,\w\s 仅识别 ASCII 范围内的单词和空白字符。


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

String tokens[] = input.split("\\s+|(?<![\\w\\s])(?=\\w)|(?<=\\w)(?![\\w\\s])|(?<=[^\\w\\s])(?=[^\\w\\s])");

正则表达式相当复杂,因为空字符串在标点字符和单词字符之间分割需要避免已经被\s+分割的情况。

由于拆分解决方案中的正则表达式相当混乱,请改用匹配解决方案

【讨论】:

    【解决方案2】:

    你想用什么语言写这个?

    您可以编写如下的正则表达式组:(.+)(\s)

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

    【讨论】:

    • 它应该在 java 中。但第一个 " 和 ( 后跟一个字符。
    猜你喜欢
    • 2012-08-13
    • 2014-11-22
    • 2011-02-24
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多