我做了一个关于标点符号和正则表达式的问题,但这很令人困惑。
Supossing我有这样的文字:
String text = "wor.d1, :word2. wo,rd3? word4!";
我这样做:
String parts[] = text.split(" ");
我有这个:
wor.d1, | :word2. | wor,d3? | word4!;
我需要做些什么?(将符号保留在边框处,但仅限于我指定的位置:.,!?:
,而不是全部。
wor,d1 | , | : | word2 | . | wor,d3 | ? | word4 | !
我正在使用这些正则表达式获得一些好的结果,但它在一个单词开头的标点符号的所有分割之前给出一个空的char。
有一种方法可以在开始时没有这个空的字符吗?
这个正则表达式是好还是有更简单的方法?
public static final String PUNCTUATION_SEPARATOR =
"("
+ "("
+ "(?=^[\"'!?.,;:(){}\\[\\]]+)"
+ "|"
+ "(?<=^[\"'!?.,;:(){}\\[\\]]+)"
+ ")"
+ "|"
+ "("
+ "(?=[\"'!?.,;:(){}\\[\\]]+($|\n))"
+ "|"
+ "(?<=[\"'!?.,;:(){}\\[\\]]+($|\n))"
+ ")"
+ ")";
答案 0 :(得分:2)
您确定要使用正则表达式吗? 通过单个char: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...
}
答案 1 :(得分:1)
对于简单的分隔符,我推荐使用StringTokenizer。但这是使用正则表达式和另一个辅助分隔符的解决方案:
String s = "one,two, three four , five";
s = s.replaceAll("([,\\s]+)", "#$1#");
Pattern p = Pattern.compile("#");
String[] result = p.split(s);
答案 2 :(得分:1)
这是我认为可行的正则表达式:
/\s|(?=[\.,:?!](\W|$))|(?<=\W[\.:?!])/
答案 3 :(得分:0)
在我看来,你想要this。首先你爆炸你的弦,第二步你使用内爆函数。
答案 4 :(得分:0)
public static final String PUNCTUATION_SEPARATOR =
"("
+ "("
+ "(?=^[\"'!?.,;:(){}\\[\\]-]+)"
+ "|"
+ "(?<=^[\"'!?.,;:(){}\\[\\]-]+)"
+ ")"
+ "|"
+ "("
+ "(?=[\"'!?.,;:(){}\\[\\]-]+($|\n))"
+ "|"
+ "(?<=[\"'!?.,;:(){}\\[\\]-]+($|\n))"
+ ")"
+ ")";