#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)
该回答引用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
字符串%
不知道你这个问题是否已经解决, 如果还没有解决的话: 语法错误(编译错误)
指未按照 Java 语法规则书写代码而产生的错误。一般集成开发软件均能提示和标 注语法错误之处
运行时错误(语义错误)
程序没有语法错误,但在运行时从外部获得不正确的数据从而导致的错误。如将11 位电话号码赋值给一个整型变量将超出其表示的数据范围而引发错误。 这类错误一般会导致程序异常终止。
逻辑错误
逻辑错误是人为导致的错误,表现为程序运行结果与预期不符。如程序的本来意愿 是计算a+b,但疏忽写成了a-b,这类错误一般不会导致程序终止,但显然不可能 得到正确的结果
上述三种错误是程序从开发到调试运行阶段面临的必须处理的问题。但将错误和异常放在一起讨论时,“错误”不是指上述三种中的任何一种。
错误:
一般指程序运行时遇到的硬件或操作系统的错误,如内存溢出、不能读取硬盘分区、 硬件驱动错误等。这是致命的,将导致程序无法运行,同时也是程序本身不能处理的。
异常:
指在运行环境正常的情况下遇到的运行时错误。异常是非致命的,但也会导致程序 的非正常终止。 Java可以捕获和处理异常。