java正则表达式匹配字符串

#java正则 #正则表达式分割#java断言

请教,想要根据 ( ) 外的 | 分割字符串,正则表达是该如何匹配呢?

例如:

%这个一个测试2|4\)11|(0jh|96)78|8\)k|字符串%   分割后应为 如果是 \(  \)  则不不认为是括号

%这个一个测试2
4\)11
(0jh|96)78
8\)k
字符串%

为什么他们写的都比我的短这么多?


import re

a = '%这个一个测试2|4\)11|(0jh|96)78|8\)k|字符串%   分割后应为 如果是 \(  \)  则不不认为是括号'

re.split(r'\|(?=(?:[^\)]|\\\(|\\\))*[\(\|])',a)

img

该回答引用ChatGPT GPT-4

代码如下

import java.util.regex.*;
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        String input = "%这个一个测试2|4\\)11|(0jh|96)78|8\\)k|字符串%";
        String regex = "(?<=\\(|^)[^\\|]*\\|*|[^\\|]*\\|*[^\\|]*(?=\\)|$)";

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);

        List<String> results = new ArrayList<>();
        while (matcher.find()) {
            String result = matcher.group();
            if (!result.isEmpty()) {
                results.add(result);
            }
        }

        for (String result : results) {
            System.out.println(result);
        }
    }
}


以下答案由GPT-3.5大模型与博主波罗歌共同编写:
可以使用正向前瞻和正向后瞻来匹配符号外的 |,同时可以使用断言来排除括号内的 |

具体的正则表达式如下:

(?<=[^()|])\|(?=[^()|]*(\(|$))(?![^()]*\))

其中,(?<=[^()|])(?=[^()|]*(\(|$)) 分别表示前后是符号外的字符或到达字符串末尾时才匹配 |(?![^()]*\)) 表示后面不能有右括号,即不在括号内匹配。

以下是具体的Java代码示例:

String input = "%这个一个测试2|4\\)11|(0jh|96)78|8\\)k|字符串%";
String regex = "(?<=[^()|])\\|(?=[^()|]*(\\(|$))(?![^()]*\\))";
String[] output = input.split(regex);
System.out.println(Arrays.toString(output));

输出结果为:

[%这个一个测试2, 4\)11, (0jh|96)78, 8\)k, 字符串%]

如果我的回答解决了您的问题,请采纳!

以下内容部分参考ChatGPT模型:
可以使用正则表达式中的断言来实现该需求,具体可以使用正向先行断言和反向先行断言。

正向先行断言:(?<=exp) 表示匹配 exp 后面的位置,但不包括 exp 本身,例如 (?<=a)b 可以匹配到 "ab" 中的 "b"。

反向先行断言:(?=exp) 表示匹配 exp 前面的位置,但不包括 exp 本身,例如 a(?=b) 可以匹配到 "ab" 中的 "a"。

根据题目要求,可以使用反向先行断言 (?=\|[^()]*\)) 来匹配 "|" 后面的位置,但不包括括号内的内容,然后再使用正向先行断言 (?<=[^()]*\|) 来匹配 "|" 前面的位置,但不包括括号内的内容。最终的正则表达式为:(?<=^[^()]*|\b[^()]*\|)[^()|]*(?=\|[^()]*\)|[^()]*$)

在 Java 中使用该正则表达式可以使用 String 类的 split 方法:

String str = "%这个一个测试2|4\\)11|(0jh|96)78|8\\)k|字符串%";
String[] result = str.split("(?<=^[^()]*|\\b[^()]*\\|)[^()|]*(?=\\|[^()]*\\)|[^()]*$)");
for (String s : result) {
    System.out.println(s);
}

输出结果为:

%这个一个测试2
4\)11
(0jh|96)78
8\)k
字符串%
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^