我有一些字符串,例如:I: 是一个字符串,带有“punctuation”。
我想像这样拆分字符串:
["I", ":", "am", "a", "string", ",", "with", "\"", "punctuation", "\"", "."]
我尝试了 text.split("[\\p{Punct}\\s]+")
但结果是 I, am, a, string, with, punctuation
...
我找到了 this解决方案,但 Java 不允许我按 \w
拆分。
最佳答案
使用这个正则表达式:
"\\s+|(?=\\p{Punct})|(?<=\\p{Punct})"
字符串上的结果:
["I", ":", "am", "a", "string", ",", "with", "", "\"", "punctuation", "\"", "."]
不幸的是,有一个额外的元素,""
与之后。这些额外的元素仅在空白字符后有标点符号时出现(并且总是出现),因此可以通过执行 myString.replaceAll("\\s+(?=\\p{Punct})", "").split(regex);
来解决。而不是 myString.split(regex);
(即在分割前去掉空格)
这是如何工作的:
-
\\s+
在一组空白处拆分,因此如果字符是空白字符,我们将删除这些字符并在该位置拆分。 (注意:我假设hello world
的字符串应该导致["hello", "world"]
而不是["hello", "", "world"]
) -
(?=\\p{Punct})
是一个前瞻,如果下一个字符是标点字符,它会拆分,但不会删除该字符。 -
(?<=\\p{Punct})
是一个 lookbehind,如果最后一个字符是标点符号则拆分。
编辑:
回应your comment ,这个正则表达式应该允许单词中的标点符号:
"\\s+|(?=\\W\\p{Punct}|\\p{Punct}\\W)|(?<=\\W\\p{Punct}|\\p{Punct}\\W})"
对于这个,您不需要使用 replaceAll
, 简单地做 myString.split(regex)
.
工作原理:
这个正则表达式非常相似,但外观发生了变化。 \\W\\p{Punct}
匹配后跟标点符号的非单词字符。 \\p{Punct}\\W
匹配一个标点符号后跟一个非单词字符。所以每个环视匹配当且仅当存在一个不在单词中间的标点符号。
关于java - 拆分字符串并用标点符号和空格分隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24222730/