解析 space 分隔的字符串,除非 space 在没有正则表达式的引号内

Parse a space delimited string, except when the space is inside quotations without regex

这个问题在 Go 中有一个副本,并且有几个使用正则表达式,但我想使用 Kotlin 而不使用正则表达式来实现这个问题。这是问题:

我想知道是否有一个好的方法 (不使用正则表达式) 我可以轻松地在 space 处拆分字符串,除非 space 是在引号内吗?

例如,改变

Foo bar random "letters lol" stuff

进入

[Foo, bar, random, "letters lol", stuff]

使用以下代码:

val splitLine = line.split(" ")

答案出来了:

[Foo, bar, random, "letters, lol", stuff]

这是不正确的。

我相信你会需要这里的正则表达式。

val text = "Foo bar random \"letters lol\" stuff"
val regex = Regex("\".*?\"|\w+")
val matches = regex.findAll(text).map{it.value}.toList()
println(matches)  // [Foo, bar, random, "letters lol", stuff]

上面使用的正则表达式模式急切地试图首先匹配双引号的术语。失败后,它会回退到匹配单词。

由于您特别要求基于 non-Regex 的代码,您可以这样做:

val words = mutableListOf<String>()
var lastWord = ""
var quote = false
for (ch in s) {
    if (ch == '"') quote = !quote
    if (ch == ' ' && !quote) {
        words.add(lastWord)
        lastWord = ""
    } else
        lastWord += ch
}
words.add(lastWord)

Try it yourself