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

Dia*_*che 4 java regex split

我有一些字符串,例如:I: am a string, with "punctuation". 我想分割字符串,如:

["I", ":", "am", "a", "string", ",", "with", "\"", "punctuation", "\"", "."]
Run Code Online (Sandbox Code Playgroud)

我试过text.split("[\\p{Punct}\\s]+")但结果却是I, am, a, string, with, punctuation......

我找到了这个解决方案,但Java不允许我拆分\w.

Jus*_*tin 7

使用这个正则表达式:

"\\s+|(?=\\p{Punct})|(?<=\\p{Punct})"
Run Code Online (Sandbox Code Playgroud)

你的字符串的结果:

["I", ":", "am", "a", "string", ",", "with", "", "\"", "punctuation", "\"", "."]
Run Code Online (Sandbox Code Playgroud)

不幸的是,还有一个额外的元素,在""之后.这些额外的元素只有在空白字符后面有一个标点字符时才会出现(并且总是出现),所以这可以通过执行myString.replaceAll("\\s+(?=\\p{Punct})", "").split(regex);而不是myString.split(regex);(即在分割之前去除空格)来修复

这是如何工作的:

  • \\s+拆分一组空格,所以如果字符是空白字符,我们将删除这些字符并在该位置拆分.(注意:我假设hello world应该导致一串["hello", "world"]而不是["hello", "", "world"])
  • (?=\\p{Punct}) 如果下一个字符是标点字符,则它是一个前瞻,但它不会删除该字符.
  • (?<=\\p{Punct}) 是一个lookbehind,如果最后一个字符是标点符号,则会分裂.

编辑:

在回复您的评论时,此正则表达式应允许在单词内标点符号:

"\\s+|(?=\\W\\p{Punct}|\\p{Punct}\\W)|(?<=\\W\\p{Punct}|\\p{Punct}\\W})"
Run Code Online (Sandbox Code Playgroud)

对于这个,你不需要使用replaceAll,只需这样做myString.split(regex).

这个怎么运作:

这个正则表达式非常相似,但外观改变了.\\W\\p{Punct}匹配非单词字符,后跟标点符号.\\p{Punct}\\W匹配标点字符后跟非单词字符.因此,如果有一个不在单词中间的标点符号,则每个环视匹配.