Regex 正则表达式-匹配非字符串的单词

Regex 正则表达式-匹配非字符串的单词,regex,kotlin,Regex,Kotlin,我试图区分单词和字符串。我设法让字符串工作,但我不太明白如何只匹配没有双引号包围的单词: 所以我想让它匹配: test 但这不应该匹配: "test" 这就是我到目前为止所做的: [^\"][a-zA-Z]*[^\"] 尽管它被双引号包围,但它仍然得到了测试 Input: "\"this is a string\" word" Expected Output: word 有什么建议吗?怎么样 assert("\"<quoted>\" word".words == listOf

我试图区分单词和字符串。我设法让字符串工作,但我不太明白如何只匹配没有双引号包围的单词:

所以我想让它匹配:

test
但这不应该匹配:

"test"
这就是我到目前为止所做的:

[^\"][a-zA-Z]*[^\"]
尽管它被双引号包围,但它仍然得到了测试

Input: "\"this is a string\" word"
Expected Output: word
有什么建议吗?

怎么样

assert("\"<quoted>\" word".words == listOf("word"))

assert("head \"<quoted>\" word".words == listOf("head", "word"))

assert("head\"<quoted>\"word".words == listOf("head", "word"))

assert("\"<escaped\\\"quoted>\"".words == emptyList())

assert("; punctuations , ".words == listOf("punctuations"))

我正在使用Kotlin。如果我把它输入一个正则表达式网站,但不是在Kotlin中,它可以正常工作:/请尝试@LukStorms提供的正则表达式,而不必转义双引号?试试正则表达式?\\p{L}\\p{M}*+++\谢谢Wiktor,你的解决方案真是太棒了!我发现的问题是,例如,当有这样一个字符串时:分开这个字符串,它仍然会得到eprate和this。但是没有办法避免,是吗?顺便说一句:如果它只识别大写的单词就可以了哇,完美的解决方案!多谢各位!你能解释一下它的大致工作原理吗?@Rechunk一点也不。注意:这种解决方案在以下几种情况下不起作用:1如果单词用标点符号分隔,2如果双引号字符串可能包含应忽略的转义双引号,3如果有复合连字符。@WiktorStribiżew sir,现在就简单点。如果输入不包含标点符号、转义字符,则无需使事情复杂化。如果太复杂,我想用语法而不是正则表达式。@Rechunk对不起,我看不清楚你的评论。现在怎么样?重构后的代码是自描述的。
inline val String.words get() = dropStrings().split("[^\\p{Alpha}]+".toRegex())
                                             .filter { it.isNotBlank() }

@Suppress("NOTHING_TO_INLINE")
inline fun String.dropStrings() = replace("\"(\\[\"]|.*)?\"".toRegex(), " ")