Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解析带引号的分隔符分隔值和转义_Java_Parser Generator_Parser Combinators_Jparsec - Fatal编程技术网

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));
         }
       };
   }