在 < > 括号之间拆分 java 字符串,包括括号,但前提是括号之间没有 space

Split a java string among < > brackets, including the brackets, but only if no space between brackets

我需要能够将字符串(例如 "This and <those> are.")转换为 ["This and ", "<those>", " are."] 形式的字符串数组。我一直在尝试使用 String.split() 命令,我得到了这个正则表达式:

"(?=[<>])"

然而,这让我很感动 ["This and ", "<those", "> are."]。我想不出一个好的正则表达式来将括号全部放在同一个元素上,而且这些括号之间也不能有空格。因此,例如,"This and <hey there> are." 应该简单地拆分为 ["This and <hey there> are."]。理想情况下,我只想依靠 split 命令来进行此操作。谁能指出我正确的方向?

实际上不可能;鉴于 'separator' 需要匹配 0 个字符,它需要全部为 lookahead/lookbehind,而那些需要固定大小的查找;您需要向前看任意远的字符串才能知道 space 是否会发生,因此,您想要什么?不可能。

只需编写一个正则表达式,FINDS 您想要的结构,这样就简单多了。简单地 Pattern.compile("<\w+>")(对你想要的括号内的东西的外观采取 select 一些自由。如果真的可以是除了 spaces 和右括号之外的任何东西,"<[^ >]+>" 就是你想要的)。

然后,循环遍历,边走边查找:

private static final Pattern TOKEN_FINDER = Pattern.compile("<\w+>");

List<String> parse(String in) {
  Matcher m = TOKEN_FINDER.matcher(in);
  if (!m.find()) return List.of(in);

  var out = new ArrayList<String>();
  int pos = 0;
  do {
    int s = m.start();
    if (s > pos) out.add(in.substring(pos, s));
    out.add(m.group());
    pos = m.end();
  } while (m.find());
  if (pos < in.length()) out.add(in.substring(pos));
  return out;
}

让我们试试看:

System.out.println(parse("This and <those> are."));
System.out.println(parse("This and <hey there> are."));
System.out.println(parse("<edgecase>2"));
System.out.println(parse("3<edgecase>"));

打印:

[This and , <those>,  are.]
[This and <hey there> are.]
[<edgecase>]
[<edgecase>, 2]
[3, <edgecase>]

看起来像你想要的。