Groovy 尝试拆分字符串时出错

Groovy Error while trying to split a String

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

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

我的代码如下:

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

问题来了

错误是:

2019-06-13 15:33:23.042 ERROR k.k.c.m.CustomKeywordDelegatingMetaClass - ❌ Illegal repetition
{
2019-06-13 15:33:23.051 ERROR c.k.katalon.core.main.TestCaseExecutor - ❌ Test Cases/KeyWordTester FAILED. Reason: java.util.regex.PatternSyntaxException: Illegal repetition
{
at java_lang_String$split[=18=].call(Unknown Source) at com.sgds.util.LoadTester.replaceParams(LoadTester.groovy:126) at com.sgds.util.LoadTester.modifyFile(LoadTester.groovy:144) at com.sgds.util.LoadTester.invokeMethod(LoadTester.groovy) at com.kms.katalon.core.main.CustomKeywordDelegatingMetaClass.invokeStaticMethod(CustomKeywordDelegatingMetaClass.java:50) at KeyWordTester.run(KeyWordTester:16) at com.kms.katalon.core.main.ScriptEngine.run(ScriptEngine.java:194) at com.kms.katalon.core.main.ScriptEngine.runScriptAsRawText(ScriptEngine.java:119) at com.kms.katalon.core.main.TestCaseExecutor.runScript(TestCaseExecutor.java:337) at com.kms.katalon.core.main.TestCaseExecutor.doExecute(TestCaseExecutor.java:328) at com.kms.katalon.core.main.TestCaseExecutor.processExecutionPhase(TestCaseExecutor.java:307) at com.kms.katalon.core.main.TestCaseExecutor.accessMainPhase(TestCaseExecutor.java:299) at com.kms.katalon.core.main.TestCaseExecutor.execute(TestCaseExecutor.java:233) at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:114) at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:105) at com.kms.katalon.core.main.TestCaseMain$runTestCase[=18=].call(Unknown Source) at TempTestCase1560432797559.run(TempTestCase1560432797559.groovy:21)

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

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

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

也不行...

您知道问题出在哪里吗?

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

你应该逃避他们:

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

您应该使用 Groovy 的原生正则表达式语法:

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