我做了一个关于标点符号和正则表达式的问题,但是它让人困惑。
假设我有这样的文本:
String text = "wor.d1, :word2. wo,rd3? word4!";
我正在做这个:
String parts[] = text.split(" ");
我有这个:
wor.d1, | :word2. | wor,d3? | word4!;
我需要做什么来得到这个?(保留边界的符号,但只有我指定的:.,!?:
,而不是全部)。
wor,d1 | , | : | word2 | . | wor,d3 | ? | word4 | !
更新
我用这些正则表达式得到了一些很好的结果,但是它在单词开头的标点符号的所有分割之前给出了一个空字符。
有一种方法可以不让这个空字符开始吗?
这个正则表达式是好的,还是有一个更简单的方法?
public static final String PUNCTUATION_SEPARATOR =
"("
+ "("
+ "(?=^["'!?.,;:(){}\[\]]+)"
+ "|"
+ "(?<=^["'!?.,;:(){}\[\]]+)"
+ ")"
+ "|"
+ "("
+ "(?=["'!?.,;:(){}\[\]]+($|n))"
+ "|"
+ "(?<=["'!?.,;:(){}\[\]]+($|n))"
+ ")"
+ ")";
您确定要使用正则表达式吗?有一种更快的按单个字符分割的实现:StringTokenizer。它可以返回分隔符
String str= "word1, word2. word3? word4!";
String delim = ",.!?";
StringTokenizer st = new StringTokenizer(str, delim, true);
while (st.hasMoreTokens()) {
String token = st.nextToken();
... // token will be: "word1", ",", " word2", ".", etc...
}
对于简单分隔符,我推荐使用StringTokenizer。但这里有一个解决方案,使用regex和另一个辅助分隔符:
String s = "one,two, three four , five";
s = s.replaceAll("([,\s]+)", "#$1#");
Pattern p = Pattern.compile("#");
String[] result = p.split(s);
这里有一个我认为会工作的正则表达式:
/s|(?=[.,:?!](W|$))|(?<=W[.:?!])/
在我看来你需要这个。首先,你爆破你的字符串,第二步,你使用内爆函数
public static final String PUNCTUATION_SEPARATOR =
"("
+ "("
+ "(?=^["'!?.,;:(){}\[\]-]+)"
+ "|"
+ "(?<=^["'!?.,;:(){}\[\]-]+)"
+ ")"
+ "|"
+ "("
+ "(?=["'!?.,;:(){}\[\]-]+($|n))"
+ "|"
+ "(?<=["'!?.,;:(){}\[\]-]+($|n))"
+ ")"
+ ")";