java - 拆分字符串并用标点符号和空格分隔

标签 java regex split

我有一些字符串,例如: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/

相关文章:

java - Android RemoteController和Pandora

python - 从多行文件中获取特定文本

javascript - 如何将 jquery attr 值转换为字符串对象以将其用作正则表达式?

r - 在 R 中提取一个固定长度的字符

PHP 和正则表达式 : Split a string by commas that are not inside brackets (and also nested brackets)

java - 解析 XML 文件时出现异常

java - 找到所有可能的大数组对的 AND-Product 的最佳方法是什么?

javascript - 电话号码的正则表达式 (JS)

c++ - 将输入的 char* 拆分为 vector

java - 从固定选项卡中删除滑动操作