Groovy在字符之前提取子字符串

Ano*_*man 16 regex string groovy

我有一堆字符串

asdf v1.0
jkl v3.04
Run Code Online (Sandbox Code Playgroud)

我的所有字符串都是一组字符,后跟一个空格,然后是'v',然后是一个数字.我想从每个字符串中提取,在'v'之前的部分和在'v'之前的空格字符,以便:

asdf v1.0 becomes 'asdf'
jkl v3.04 becomes 'jkl'
Run Code Online (Sandbox Code Playgroud)

只需要一些帮助.我尝试takeWhile { it != 'v' }但最终在结果字符串中的'v'之前包含了我不想要的空格.

man*_*uti 30

您可以简单地提取子字符串:

input.substring(0, input.lastIndexOf(" v"))
Run Code Online (Sandbox Code Playgroud)

获得后面的部分v:

input.substring(input.lastIndexOf(" v") + 2)
Run Code Online (Sandbox Code Playgroud)


Bal*_*Rog 5

我认为,鉴于上述标准,以下将在所选解决方案不会的地方给出正确的结果:

String stringParser(String inputString) {
    inputString ? inputString.split(/ v\d/)[0] : ''
}
Run Code Online (Sandbox Code Playgroud)

一些示例测试:

assert stringParser('John Kramer v1.1') == 'John Kramer'
assert stringParser('Kramer v Kramer v9.51') == 'Kramer v Kramer'
assert stringParser('A very hungry caterpillar v2.6') == 'A very hungry caterpillar'
Run Code Online (Sandbox Code Playgroud)

  • 你总是可以搞砸:`"Best v3rsion v3.0"`,这是一个更好的尝试,它在语义上与@manouti 的更新版本相同:`(input =~ /(.*) v/)[0][1 ]`。贪婪的 `.*` 给出了最好的结果,因为我们需要最后一个 `vX.X`,`[0]` 是第一个匹配,`[1]` 是第一组(括号中的内容)。 (2认同)