gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:43:41 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com