我正在解析一个包含数据的文本文件。
无论何时是文本数据,数据都在引号内。例如:“这里有任何文字”
问题是数据内部我也可以引用,但总是会引用另一个引号。例如:“文字,他说”“你好”“”
我尝试了以下内容,没有成功:
"(.+?)"(?!")
如何定义与该格式的文本数据匹配的REGEX?
P.S。:不知道它是否有帮助,但每种类型的数据都以;
分隔答案 0 :(得分:1)
试试这个正则表达式(未经测试):
"([^"]|"")*"
编辑:(没意识到你不想自己匹配报价)
(?<=")([^"]|"")*(?=")
答案 1 :(得分:1)
参考我之前发布的帖子here,您应该可以使用以下内容:
(?:\"[^\"]*?\")*
答案 2 :(得分:0)
这只会在双引号上分开,但也会分开 给你引号外的数据 - 希望这有帮助
public static void main(String[] args) {
// TODO code application logic here
Pattern p = Pattern.compile("[\"]{2}");
String[] result1 =
p.split("\"\"A01 A02\"\" \"\"B01 B02\"\"");
for (int i=0; i<result1.length; i++)
System.out.printf("DATA: ]]%s[[\n", result1[i]);
String[] result3 =
p.split("\"\"A21 \" A22\"\" STUFF \"\"B21 B22\"\"");
for (int i=0; i<result3.length; i++)
System.out.printf("DATA: ]]%s[[\n", result3[i]);
}
答案 3 :(得分:0)
我可以确定,有一个字符,不属于消息的一部分,如~
,您可以用〜替换“”,进行匹配,最后转换~
至""
返回。
text.replaceAll ("\"\"", "~").
replaceAll ("(\"[^\"]+)", "($1)").
replaceAll ("~", "\"\"")
理论上。
实际上,我在开头和结尾都得到匹配的引号,所以这个文字:
echo 'asdf " I say ""hello"" " foo " you say ""goodbye"" "baz'
被翻译为:
echo 'asdf (" I say ""hello"" )(" foo )(" you say ""goodbye"" )("baz' )
我找不到错误,但也许这个想法很有用。
答案 4 :(得分:0)
如果你可以确定输入结构良好(没有不平衡的引号),那么这是有效的(如果它没有很好地形成,那么你想做什么?):
"(([^"]*?)((""[^"]*?)*?))"(?!")
这是一个引用,后面跟着引号零次或多次,跟随任意数量的组,其中包含一对双引号,后跟任意数量的非引号,并以引号后跟引号结尾
如果您确定每个数据都以";
结尾,那么它会变得更容易
"(([^"]*?)((""[^"]*?)*?))";
但是该行中的最后一个是以";
结尾还是只是引用?
从JoelFan和OldCurmudgeon的灵感来看,这有点简单:
"((?:[^"]|"")*)"
对于每个模式,数据都在捕获组1.因此,您的代码将类似于:
while (matcher.find()) {
data = matcher.group(1);
/* do whatever you want with the data such as replace '""' with '"' */
}
当然,在将它们编写为Java字符串时,您必须转义模式中的引号,因此它们最终在您的代码中看起来像这样:
"\"(([^\"]*?)((\"\"[^\"]*?)*?))\"(?!\")"
或
"\"(([^\"]*?)((\"\"[^\"]*?)*?))\";"
或(我将在代码中使用的内容)
"\"((?:[^\"]|\"\")*)\""