如何用Java Pattern解析含歧义空格分隔符的字符串并返回所有组合
生成带空格标识符的所有可能分割组合方案
问题分析
你遇到的核心问题是:协议行的分割空格与标识符内部的空格无法通过单次正则贪婪/非贪婪匹配区分——([A-Za-z ]+) ([A-Za-z ]+)这类正则只能返回一种匹配结果(贪婪模式取最后一个空格分割,非贪婪模式取第一个),无法枚举所有可能的分割位置。
优先正则实现方案
利用java.util.regex.Pattern匹配所有空格位置,以此为分割点生成所有合法组合,步骤如下:
- 用正则匹配输入字符串中的所有空格,记录每个空格的索引位置;
- 遍历每个空格索引,将字符串分割为前后两部分(需确保前后部分非空,避免无效的首尾空格分割);
- 收集所有分割后的标识符组合,后续可对组合进行有效性验证。
代码示例
import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class IdentifierParser { public static List<String[]> generateAllCombinations(String input) { List<String[]> validCombinations = new ArrayList<>(); Pattern spacePattern = Pattern.compile("\\s"); Matcher matcher = spacePattern.matcher(input); // 遍历所有空格位置,生成分割组合 while (matcher.find()) { int splitPos = matcher.start(); // 过滤首尾空格的无效分割 if (splitPos > 0 && splitPos < input.length() - 1) { String identifier1 = input.substring(0, splitPos); String identifier2 = input.substring(splitPos + 1); validCombinations.add(new String[]{identifier1, identifier2}); } } return validCombinations; } public static void main(String[] args) { String testInput = "abc def uvw xyz"; List<String[]> combinations = generateAllCombinations(testInput); // 输出所有组合 for (String[] combo : combinations) { System.out.printf("组合:标识符1='%s',标识符2='%s'%n", combo[0], combo[1]); } // 后续可添加标识符有效性验证逻辑 // validateIdentifiers(combo[0], combo[1]); } }
非正则备选方案
如果不需要强制用正则,也可以直接遍历字符串的每个字符,找到所有空格索引后分割,逻辑和上面一致:
public static List<String[]> generateAllCombinationsNonRegex(String input) { List<String[]> validCombinations = new ArrayList<>(); for (int i = 0; i < input.length(); i++) { if (input.charAt(i) == ' ' && i > 0 && i < input.length() - 1) { String id1 = input.substring(0, i); String id2 = input.substring(i + 1); validCombinations.add(new String[]{id1, id2}); } } return validCombinations; }
补充说明
生成所有组合后,可根据业务逻辑对每个标识符进行有效性验证(比如匹配预设的标识符集合、校验格式规则等),过滤掉不符合要求的组合即可。
内容的提问来源于stack exchange,提问作者EagleRainbow
相关产品推荐
相关产品推荐

