java - 除非在特定情况下,否则如何匹配单个字符
问题描述
我有一个字符串,我想在每个分号处分成几部分;
。
我String.split(regex)
为此使用 JAVA,创建了一个字符串数组。
例子:
string 1;
string 2;
string 3;
string 4 (
substring 1;
substring 2;
substring 3;
);
string 4;
我现在正在用line.split("\\s*;\\s*");
...
但是,正如预期但不想要的那样,这让我回来了["string 1", "string 2", "string 3", "string 4 (\nsubstring 1", "substring 2", "substring 3", ")", "string 4", ""]
。
;
那么,除了括号内的那些(子字符串之后的那些),我如何匹配每个,以便我可以拆分它?
编辑:
我确实设法创建了一个正则表达式来匹配“;” 在括号内,但不在括号外......但在使用逻辑并转换~(a^b)
为~av~b
(德摩根法则)之后,我确实制作了一个正则表达式来匹配“;” 括号外。
但它仍然不起作用并且仍然在每个分号中中断......它与Java本身有关吗?
当前模式:((?<![\S\s]*?\([\S\s]*?)|(?![\S\s]*?\)[\S\s]*?));
解决方案
我确信一些 Java 专业人士有比正则表达式更好的解决方案,但这可能有点接近:
.*\((?:\s*(?:[^\r\n]*;)\s*)+\);|[^\r\n]+
我猜你可能想把trim
它推到一个数组中。
测试
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegularExpression{
public static void main(String[] args){
final String regex = ".*\\((?:\\s*(?:[^\\r\\n]*;)\\s*)+\\);|[^\\r\\n]+";
final String string = "string 1;\n"
+ "string 2;\n"
+ "string 3;\n"
+ "string 4 (\n"
+ " substring 1;\n"
+ " substring 2;\n"
+ " substring 3;\n"
+ ");\n"
+ "string 4;\n"
+ "string 1;\n"
+ "string 2;\n"
+ "string 3;\n"
+ "string 4 (\n"
+ " substring 1;\n"
+ " substring 2;\n"
+ " substring 3;\n"
+ ");\n"
+ "string 4;";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
}
}
输出
Full match: string 1;
Full match: string 2;
Full match: string 3;
Full match: string 4 (
substring 1;
substring 2;
substring 3;
);
Full match: string 4;
Full match: string 1;
Full match: string 2;
Full match: string 3;
Full match: string 4 (
substring 1;
substring 2;
substring 3;
);
Full match: string 4;
如果您想简化/修改/探索表达式,它已在regex101.com的右上角面板中进行了说明。如果您愿意,您还可以在此链接中观看它如何与一些示例输入匹配。
推荐阅读
- node.js - NodeJS - 配置无法加载自定义环境变量
- c# - 将List volume命令的结果重定向到c#中的列表框
- html - 在同一行上为徽标和文本设置样式 CSS
- java - 如何从 XML SOAP 模式创建响应 POJO
- sql - 在最后一列插入日期差异
- android - 隐藏上下文菜单项
- python-3.x - AbstractEventLoop 方法 create_server 在 asyncio 的事件模块中如何工作
- javascript - Javascript 加密 AES 解密
- scala - 如何正确测量 Spark 中的经过时间?
- python - KeyError:“找不到枚举 caffe.EmitConstraint.EmitType”