java - 正则表达式拆分字符串并在双引号内保留内容
问题描述
是的,我知道这已经被问了很多,但是我没有找到解决方案来解决我正在尝试做的事情。所以请允许我解释一下我的问题是什么。
我需要找到一种方法,以便基于 ',' 、 '.'、空格和引号之间对字符串进行标记,而不在引号之间应用其他正则表达式规则。
允许此“[]”代表这些示例的单个空格。
假设我有一个这样的字符串:
ADD[]r2,[]r3
现在使用这样的正则表达式:
((?<=\s)|(?=\s+))|((?<=,))|(?=\.)
我可以像这样拆分字符串:
1: ADD
2: []
3: r2,
4: []
5: r3
这就是我要的。
现在假设我有一个这样的字符串:
"ADD[]r2,[]r3"[]"foo[]bar"
现在使用这样的正则表达式:
(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)
我可以像这样拆分字符串:
1: "ADD[]r2,[]r3"
2: []
3: "foo[]bar"
但如果我有这样的字符串:
ADD[]r2,[]r3[]"ADD[]r2,[]r3"
并使用了这样的正则表达式:
(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)((?<=\s)|(?=\s+))|((?<=,))|(?=\.)
我最终会得到这样的结果:
1:ADD
2:[]
3:r2,
4:[]
5:r3
6:[]
7:"Add[]r2,
8:[] r3"
但我想要的是这样的:
1:ADD
2:[]
3:r2,
4:[]
5:r3
6:[]
7:"Add[]r2,[]r3"
是否可以使用正则表达式来做到这一点?还是我需要做一些更复杂的事情?我要做的基本上是制作一个正则表达式来拆分代码语法。我只需要一种方法来分割一条线,就像我描述的那样。
任何帮助或建议将不胜感激。
编辑:我正在尝试做的示例驱动代码
String line = "ADD r2, r3 \"ADD r2, r3\"";
String[] arrLine = line.substring(0, line.length()).split("(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)((?<=\\s)|(?=\\s+))|((?<=,))|(?=\\.)");
for(int i = 0; i < arrLine.length; i++) {
System.out.println(arrLine[i]);
}
解决方案
除了使用拆分之外,您还可以匹配从开始到结束的双引号,或者匹配空白字符,或者匹配除空白和双引号之外的所有字符。
在 Java 中,您可以用于\h
匹配水平空白字符,或用于\s
匹配也可以匹配换行符的空白字符。
"[^"]*"|\h+|[^\h"]+
在 Java 中
String regex = "\"[^\"]*\"|\\h+|[^\\h\"]+";
String string = "ADD r2, r3 \"ADD r2, r3\"";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println(matcher.group(0));
}
输出
ADD
r2,
r3
"ADD r2, r3"
推荐阅读
- python-3.x - 如何使用 NLTK 包在文本中获取有关人口/国家/地区的信息
- python - 使用 boto3 将图像上传到 AWS S3。单击 URL 时会下载它
- laravel-5 - 移动多维数组时的数组
- django - 在 django 中编辑保存的用户配置文件
- android - 任务执行失败
- django - Django rest框架序列化过滤的外键
- php - Authorize.Net SHA512 哈希验证问题
- docker - 看不到 Docker 容器内的文件更改
- node.js - SVG 图标未在捆绑为节点模块的 TypeScript React 组件中呈现
- android - 错误:程序类型已存在:androidx.core.R