java - 在正则表达式 java 中获取括号内的文本以及分隔符?

标签 java regex split delimiter

我有一个由一组不同的分隔符分隔的多行字符串,

A Z DelimiterB B X DelimiterA (C DelimiterA D) DelimiterB (E DelimiterA F) DelimiterB G DelimiterA H

我需要用定界符拆分该字符串,但如果某些单词在括号内,则将括号提取为单个单词,即使它包含定界符。我需要将它们提取如下,

A Z
DelimiterB
B X
DelimiterA
(C DelimiterA D) (extract with brackets)
DelimiterB
(E DelimiterA F)
DelimiterB
G
DelimiterA
H

目前我正在使用这个表达式按分隔符分割,

(((?<=DelimiterA)|(?=DelimiterA))|((?<=DelimiterB)|(?=DelimiterB)))

我尝试了以下方法,但它不起作用。那么我怎样才能让它发挥作用呢?

((?=\()|(?<=\))|(((?<=DelimiterA)|(?=DelimiterA))|((?<=DelimiterB)|(?=DelimiterB))))

Java 代码,

String txt = "A DelimiterB B DelimiterA (C DelimiterA D) DelimiterB (E DelimiterA F) DelimiterB G DelimiterA H";
String[] texts = txt.split("((?=\()|(?<=\))|(((?<=DelimiterA)|(?=DelimiterA))|((?<=DelimiterB)|(?=DelimiterB))))");

for (String word : texts) {
    System.out.println(word);
}

最佳答案

IMO,匹配比拆分更容易

由于还需要“分隔符”,我建议改为匹配我们需要的模式。根据给出的示例,我们有以下模式需要捕获。

  1. (C DelimiterA D) - 方括号包含一个词、定界符和一个词
    这是 "\\(\\w+ (DelimiterA|DelimiterB) \\w+\\)"
  2. DelimiterB - 整个分隔符。
    这是 "(DelimiterA|DelimiterB)" .
  3. B , B X - 一个或多个不是定界符的词。
    如何检查单词不是定界符?
    我们可以检查中间的“”后面/前面没有定界符(check Regex not operator),即"\\w+((?<!(DelimiterA|DelimiterB))\\s(?!(DelimiterA|DelimiterB))\\w+)*" .
import java.util.Scanner;

public class SplitWithCustomDelimiter {
    public static void main(String[] args) {
        String txt = "A Z DelimiterB B X DelimiterA (C DelimiterA D) DelimiterB (E DelimiterA F) DelimiterB G DelimiterA H";
        // scanner can accept different source
        Scanner scanner = new Scanner(txt);
        scanner.findAll(
                "\\(\\w+ (DelimiterA|DelimiterB) \\w+\\)" +
                "|(DelimiterA|DelimiterB)" +
                "|\\w+((?<!(DelimiterA|DelimiterB))\\s(?!(DelimiterA|DelimiterB))\\w+)*"
                )
                .map(matchResult -> matchResult.group()).forEach(System.out::println);
    }
}

关于java - 在正则表达式 java 中获取括号内的文本以及分隔符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71774251/

相关文章:

javascript - 如何根据 javaScript 中的特定字符序列拆分文本

r - 将向量拆分为平衡列表(列表元素的平衡和)

java - Java 中的图标 - 如何在面板中添加图标

Java 数组按类排序

javascript - 正则表达式用逗号分隔验证字符串

c# - 检查字符串是否至少包含每个 : lowercase letter, 大写字母、数字和特殊字符之一

python - 在Python中查找拆分字符串的所有列表排列

java - 构建 PC 对象的最佳设计模式?

java - JFrame 文本警报结果

regex - 正则表达式提取嵌套括号内的单词