拆分多个分隔符但将分隔符保留在同一个字符串上

时间:2014-12-21 23:37:43

标签: java regex split

我想要正则表达式的帮助来解决以下问题:

我有一个字符串,例如“1£23 $ 456 $£$”

当我拆分它时,我希望我的字符串数组中的输出包含:

1£
23$
456$
£
$

任何人都知道如何最好地解决这个问题?解决方案需要满足这些额外要求:

  1. 还分隔分隔符字符:+-*/
  2. 非分隔符字符只是在分隔符之前带有可选空格的数字。
  3. 任何此类空格都是价值的一部分,而不是分隔符本身。

3 个答案:

答案 0 :(得分:3)

使用功能更强大的Matcher功能代替String.split。以下代码应该有效,但尚未优化:

Pattern pattern = Pattern.compile("\\d*(\\$|£)");

String input = "1£23$456$£$";
Matcher matcher = pattern.matcher(input);
List<String> output = new ArrayList<>();
while (matcher.find()) {
    output.add(matcher.group());
}

打印出output.toString()生成:

  

[1£, 23$, 456$, £, $]


更新了要求:

  1. 还包括分隔符字符:+-*/
  2. 非分隔符字符只是在分隔符之前带有可选空格的数字。
  3. 任何此类空格都是价值的一部分,而不是分隔符本身。
  4. 使用正则表达式:\\d*\\s*[-\\+\\*/\\$£]

    这种模式,用这个给定的输入:

      

    1£23$456$£$7+89-1011*121314/1 £23 $456 $ £ $7 +89 -1011 * 121314 /

    将生成此输出:

      

    [1£, 23$, 456$, £, $, 7+, 89-, 1011*, 121314/, 1 £, 23 $, 456 $, £, $, 7 +, 89 -, 1011 *, 121314 /]

答案 1 :(得分:2)

使用后面看,这是非消费的:

String[] parts = str.split("(?<=\\D)");

这就是它的全部。正则表达式意味着“在每个非数字之后”进行拆分,这似乎正是您的意图。


一些测试代码:

String str = "1£23$456$£$";
String[] parts = str.split("(?<=\\D)");
System.out.println( Arrays.toString( parts));

输出:

[1£, 23$, 456$, £, $]

答案 2 :(得分:0)

你可能想要这个

Matcher m = Pattern.compile("[^$£]*(\\$|£)").matcher(input);