【问题标题】:Groovy Error while trying to split a String尝试拆分字符串时出现 Groovy 错误
【发布时间】:2019-06-13 22:24:07
【问题描述】:

我正在尝试在每个 '{' 处拆分一个字符串。
我的字符串看起来像{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(Unknown Source) 在 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)))

也不行……

你知道问题出在哪里吗?

【问题讨论】:

  • 我从未使用过 Groovy,所以我所说的可能无关紧要,但在 Java 中split 使用正则表达式(正则表达式),其中{ 被视为{n}{n,m} 的开始 量词,例如a{3}代表aaa。要使其成为简单的字符,您需要 escape 它。在 Java 中,您可以使用 spit("\\{") 手动转义它,或使用 split(Pattern.quote("{"))Pattern 生成将 { 表示为文字的正则表达式。

标签: string groovy katalon-studio


【解决方案1】:

您应该使用 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

【讨论】:

  • 你只需要.split( /[{}]/ )
  • 另一种方式:txt.findAll(/([A-Z]+):(\d+)/).collectEntries { it.split(':', 2) }
【解决方案2】:

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

你应该逃避它们:

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

【讨论】:

  • 有趣的事实:} 在 Java 中并不总是特别的,并且不需要转义。例如,像a{2}} 这样的正则表达式代表字符串aa},因为最后一个} 不是任何量词{..} 的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 2011-09-03
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多