Groovy - конвертировать строку во вложенные списки - PullRequest
0 голосов
/ 15 января 2020

В groovy я пытаюсь преобразовать следующую строку в отдельные пары, которая является формой коллекций. Я попытался использовать eval в groovy, но в данный момент он вызывает исключение. Есть ли какой-нибудь элегантный способ конвертировать эту строку.

[[u'abcd', u'12345'], [u'cmnln', u'12121'], [u'mnmnnkj', u'11212']]
String str = "[[u'abcd', u'12345'], [u'cmnln', u'12121'], [u'mnmnnkj', u'11212']]"
list2 = Eval.me(str)

Ожидаемый результат:

Пары: abcd, 12345 cmnln, 12121 mnmnnkj, 12121

Фактический результат:

hudson.remoting.ProxyException: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Script1.groovy: 1: unexpected token: abcd @ line 1, column 4.
   [[u'abcd', u'12345'], [u'cmnln', u'12121'], [u'mnmnnkj', u'11212']]
      ^

1 error
at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
    at org.codehaus.groovy.control.ErrorCollector.addFatalError(ErrorCollector.java:150)
    at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:120)
    at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:132)
    at org.codehaus.groovy.control.SourceUnit.addError(SourceUnit.java:350)
    at org.codehaus.groovy.antlr.AntlrParserPlugin.transformCSTIntoAST(AntlrParserPlugin.java:144)
    at org.codehaus.groovy.antlr.AntlrParserPlugin.parseCST(AntlrParserPlugin.java:110)
    at org.codehaus.groovy.control.SourceUnit.parse(SourceUnit.java:234)
    at org.codehaus.groovy.control.CompilationUnit$1.call(CompilationUnit.java:168)
    at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:943)
    at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:605)
    at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)
    at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)
    at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
    at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
    at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:584)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:623)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:594)
    at groovy.util.Eval.me(Eval.java:69)
    at groovy.util.Eval.me(Eval.java:52)
    at groovy.util.Eval$me.callStatic(Unknown Source)

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Ваша попытка:

String str = "[[u'abcd', u'12345'], [u'cmnln', u'12121'], [u'mnmnnkj', u'11212']]"
list2 = Eval.me(str)

Это не сработает, поскольку значение, которое вы передаете Eval.me(...), недопустимо Groovy код. В частности, такие выражения, как u'abcd' и u'12345' недопустимы.

Вам понадобится написать синтаксический анализатор или хотя бы какой-нибудь код синтаксического анализа, чтобы разбить это, и как это сделать, зависит от знания данных , Например, если вы знаете, что каждое из этих значений String имеет префикс u и u никогда не появляется в данных, вы можете сделать что-то наивное, например:

        String input = "[[u'abcd', u'12345'], [u'cmnln', u'12121'], [u'mnmnnkj', u'11212']]"
        String processedInput = input.replaceAll 'u', ''
        def result  = Eval.me processedInput
        println result

Если a u может появиться в данных, тогда вам понадобится более сложное регулярное выражение.

0 голосов
/ 16 января 2020

Если вы любите излишне, хотите подождать полсекунды для результата и думаете, что самое время начать использовать Python 2 сейчас , это тоже работает:

@Grab('org.python:jython-standalone:2.7.1')
import org.python.util.PythonInterpreter

String str = "[[u'abcd', u'12345'], [u'cmnln', u'12121'], [u'mnmnnkj', u'11212']]"

println(new PythonInterpreter().withCloseable{ it.eval str })
// ⇒ [[abcd, 12345], [cmnln, 12121], [mnmnnkj, 11212]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...