[英]Split a string and separate by punctuation and whitespace
我有一些字符串,例如: I: am a string, with "punctuation".
我想分割字符串,如:
["I", ":", "am", "a", "string", ",", "with", "\"", "punctuation", "\"", "."]
我试过text.split("[\\\\p{Punct}\\\\s]+")
但结果是I, am, a, string, with, punctuation
...
我找到了这个解决方案,但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})
是一个(?<=\\\\p{Punct})
,如果最后一个字符是标点字符,则会分裂。 编辑:
在回复您的评论时 ,此正则表达式应允许在单词内标点符号:
"\\s+|(?=\\W\\p{Punct}|\\p{Punct}\\W)|(?<=\\W\\p{Punct}|\\p{Punct}\\W})"
对于这个,你不需要使用replaceAll
,只需要执行myString.split(regex)
。
这个怎么运作:
这个正则表达式非常相似,但外观改变了。 \\\\W\\\\p{Punct}
匹配一个非单词字符,后跟一个标点字符。 \\\\p{Punct}\\\\W
匹配标点字符后跟非单词字符。 因此,如果有一个标点符号不在单词的中间,则每个环视匹配。
或者尝试这个,收集一个ArrayList:
String s = "I: am a string, with \"punctuation\".";
Pattern pat = Pattern.compile( "\\w+|\\S" );
Matcher mat = pat.matcher( s );
while( mat.find() ){
System.out.print( mat.group() + "/" );
}
System.out.println();
输出:
I/:/am/a/string/,/with/"/punctuation/"/./
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.