【问题标题】:Splitting on multiple delimiters but keep the delimiters on the same string在多个分隔符上拆分,但将分隔符保持在同一字符串上
【发布时间】:2026-02-01 06:10:01
【问题描述】:

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

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

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

1£
23$
456$
£
$

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

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

【问题讨论】:

  • 英镑符号和美元符号是您输入字符串中仅有的两个分隔符,还是可能有其他分隔符?只有知道输入的限制,才能制作出好的正则表达式。

标签: java regex split


【解决方案1】:

使用更强大的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. 任何此类空格都是值的一部分,而不是分隔符本身。

使用正则表达式:\\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 /]

【讨论】:

  • 看起来您正在使用的正则表达式存在问题,或者更多是无效的转义序列。
  • 谢谢,所以我也添加了 + - * / 这给了我 \\d*(\\$|£|-|\\+|\*|/) 但这似乎是错误的,你能确认我是否犯了错误
  • 输入也可以包含空格,因此输入可以或通常是 9 * 9 / 9 $ £ 输出应如上
  • @user1383163 空格是否被视为分隔符或数值的一部分?当我们在这里时,分隔符之前的值是否仅包含数字或其他文本?
  • 字符串中只有数字,空格不被视为分隔符,而是值的一部分
【解决方案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$, £, $]

【讨论】:

    【解决方案3】:

    你可能想要这个

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

    【讨论】:

    • 不应该是[^$£]*(\$|£)