尝试拆分字符串时出现Groovy错误

时间:2019-06-13 13:47:59

标签: string groovy katalon-studio

我正在尝试在每个'{'处拆分一个字符串。
我的字符串看起来像{RANDOM:4{LETTER:5}}

据我所知,我应该使用String.split()函数。

我的代码如下:

public static String replaceParams(String str) {
    System.out.println(str.split("{"));
}

问题来了。

错误是:

  

2019-06-13 15:33:23.042错误k.k.c.m.CustomKeywordDelegatingMetaClass   -❌非法重复
  {
  2019-06-13 15:33:23.051错误c.k.katalon.core.main.TestCaseExecutor-❌测试用例/ KeyWordTester   失败。原因:java.util.regex.PatternSyntaxException:非法   重复
  {
    在java_lang_String $ split $ 0.call(未知源)在   com.sgds.util.LoadTester.replaceParams(LoadTester.groovy:126)在   com.sgds.util.LoadTester.modifyFile(LoadTester.groovy:144)在   com.sgds.util.LoadTester.invokeMethod(LoadTester.groovy)在   com.kms.katalon.core.main.CustomKeywordDelegatingMetaClass.invokeStaticMethod(CustomKeywordDelegatingMetaClass.java:50)     在KeyWordTester.run(KeyWordTester:16)在   com.kms.katalon.core.main.ScriptEngine.run(ScriptEngine.java:194)在   com.kms.katalon.core.main.ScriptEngine.runScriptAsRawText(ScriptEngine.java:119)     在   com.kms.katalon.core.main.TestCaseExecutor.runScript(TestCaseExecutor.java:337)     在   com.kms.katalon.core.main.TestCaseExecutor.doExecute(TestCaseExecutor.java:328)     在   com.kms.katalon.core.main.TestCaseExecutor.processExecutionPhase(TestCaseExecutor.java:307)     在   com.kms.katalon.core.main.TestCaseExecutor.accessMainPhase(TestCaseExecutor.java:299)     在   com.kms.katalon.core.main.TestCaseExecutor.execute(TestCaseExecutor.java:233)     在   com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:114)     在   com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:105)     在com.kms.katalon.core.main.TestCaseMain $ runTestCase $ 0.call(未知   来源)   TempTestCase1560432797559.run(TempTestCase1560432797559.groovy:21)

我搜索了整个代码,并向您保证没有{没有关闭。

我做的第一件事是我认为这是编译器语法检查器问题,我尝试用{ascii}替换{,如下所示:

System.out.println(str.split(Character.toString((char)123)))

也不起作用...

您知道问题可能出在哪里吗?

2 个答案:

答案 0 :(得分:3)

您应该使用Groovy的本机regexp语法:

def res = '{RANDOM:4{LETTER:5}}'.split( /[\{\}]/ )
assert ['', 'RANDOM:4', 'LETTER:5'] == res

此外,我认为split()并不是您真正需要的。根据您的数据,您希望:

String txt = '{RANDOM:4{LETTER:5}}'
def res = [:]
txt.eachMatch( /[\{\}]?([A-Z]+):(\d+)[\{\}]?/ ){ res[ it[ 1 ] ] = it[ 2 ].toInteger() }
assert [RANDOM:4, LETTER:5] == res

答案 1 :(得分:1)

{和}在Java的正则表达式(以及与此有关的大多数其他方言)中是特殊的:它们是重复量词{n,m}的开始和结束标记,其中n和m是整数。因此出现错误信息:“非法重复”。

您应该逃脱它们:

public static String replaceParams(String str) {
    System.out.println(str.split("\\{"));
}