解析 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)
这个问题在 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)