Java 如何解析带引号的分隔符分隔值和转义
我想用引号字符解析分隔符分隔的值,并转义为引号 例如:Java 如何解析带引号的分隔符分隔值和转义,java,parser-generator,parser-combinators,jparsec,Java,Parser Generator,Parser Combinators,Jparsec,我想用引号字符解析分隔符分隔的值,并转义为引号 例如:a,“b”“c”“”,d->预计将被分成三列(a),(b“c”),(d)假设逗号作为分隔符,引号既是引号字符又是转义字符 我还想支持多个分隔符和封闭字符 例如:a,“b”“c”“”| d->如果我们同时使用逗号和|作为分隔符,则应将其作为三列进行排列 另一个例子:a,| d->如果我们同时使用逗号和作为分隔符,作为右附件,\作为转义符,则预期将解析为三列 是否可以使用JParsec创建解析器组合器 在花了一些时间使用API之后,我希望下面的代
a,“b”“c”“”,d
->预计将被分成三列(a
),(b“c”
),(d
)假设逗号作为分隔符,引号既是引号字符又是转义字符
我还想支持多个分隔符和封闭字符
例如:a,“b”“c”“”| d
->如果我们同时使用逗号和|
作为分隔符,则应将其作为三列进行排列
另一个例子:a,| d
->如果我们同时使用逗号和
作为分隔符,
作为右附件,\
作为转义符,则预期将解析为三列
是否可以使用JParsec创建解析器组合器
在花了一些时间使用API之后,我希望下面的代码能够正常工作,但它并没有像解析上面的示例那样正常工作
Parser<?> quote_content = Scanners.notAmong(rightEnclose).many();
Parser<?> quoted = Scanners.nestableBlockComment(Scanners.among(leftEnclose),
Scanners.among(rightEnclose), quote_content);
Parser<?> unquoted = Scanners.notAmong(delimiter + leftEnclose);
Parser<?> chunk = Parsers.or(escapedSequence(), unquoted);
Parser<?> all = chunk().many1().source().sepBy(Scanners.among(delimiter));
Parser quote_content=Scanners.notAmong(rightclosure.many();
Parser quoted=Scanners.nestableBlockComment(Scanners.withen(leftInclude)),
扫描器。其中(右括号),引用内容);
Parser unquote=Scanners.notAmong(分隔符+左括号);
Parser chunk=Parsers.or(escapedSequence(),无引号);
Parser all=chunk().many1().source().sebby(Scanners.withen(delimiter));
请建议是否可以使用JParsec,是否有更好的替代方案?以下是一个基本的工作示例,使用双引号作为字符串封闭,并使用双引号转义双引号(类似SQL的字符串…):
@Test public void Test()引发异常{
解析器escapingDoubleQuoteString=pattern(regex(“(\”\”)|[^\”,])*”,“string”);
解析器quoted=escapingDoubleQuotesString//
.between(isChar(“”)、isChar(“”).source()//
.map(unquoteString());
资产(quoted.parse(“\”c\”).isEqualTo(“\”c”);
Parser unquoted=escapingdoublequoteString.source().map(unescapeQuotes());
assertThat(unquoted.parse(“\”c”)).isEqualTo(“\”c”);
解析器separated=quoted.or(unquoted.sebby)(模式(regex(“\\s*,\\s*”),逗号));
assertThat(separated.parse(“a,\“b\”\“c\”\“c\”,d”)。实际包含(“a”,“b\“c\”,“d”);
}
private Map开始研究JParsec,以支持多个分隔符(逗号或|可以用作分隔符)之类的场景。能否添加“escapeSequence()”的代码,您的示例中缺少该代码。今天我将尝试一下(我是JParsec的当前维护人员…)
@Test public void test() throws Exception {
Parser<Void> escapingDoubleQuotesString = pattern(regex("((\"\")|[^\",])*"), "string");
Parser<String> quoted = escapingDoubleQuotesString //
.between(isChar('"'), isChar('"')).source() //
.map(unquoteString());
assertThat(quoted.parse("\"\"\"c\"")).isEqualTo("\"c");
Parser<String> unquoted = escapingDoubleQuotesString.source().map(unescapeQuotes());
assertThat(unquoted.parse("\"\"c")).isEqualTo("\"c");
Parser<List<String>> separated = quoted.or(unquoted).sepBy(pattern(regex("\\s*,\\s*"), "comma"));
assertThat(separated.parse("a,\"b\"\"c\"\"\", d")).containsExactly("a", "b\"c\"", "d");
}
private Map<? super String, ? extends String> unescapeQuotes() {
return new Map<String, String>() {
@Override public String map(String s) {
return s.replace("\"\"", "\"");
}
};
}
private Map<String, String> unquoteString() {
return new Map<String, String>() {
@Override public String map(String s) {
return unescapeQuotes().map(s.substring(1, s.length() - 1));
}
};
}