我已经通过正则表达式生成了一个包含所有被定义为标点符号的标点符号的常量,即
PUNCTUATION = " !\"',;:.-_?)([]<>*#\n\t\r"
唯一的问题是我不确定如何使用它来删除指定单词中的所有前导和尾随标点符号。我尝试过类似的方法replaceAll
,startsWith
但没有运气。
有什么建议吗?
完全未经测试,但应该可以工作:
public static String trimChars(String source, String trimChars) {
char[] chars = source.toCharArray();
int length = chars.length;
int start = 0;
while (start < length && trimChars.indexOf(chars[start]) > -1) {
start++;
}
while (start < length && trimChars.indexOf(chars[length - 1]) > -1) {
length--;
}
if (start > 0 || length < chars.length) {
return source.substring(start, length);
} else {
return source;
}
}
你会这样称呼它:
String trimmed = trimChars(input, PUNCTUATION);
String PUNCTUATION = " !\"',;:.-_?)([]<>*#\n\t\r";
String pattern = "([" + PUNCTUATION.replaceAll("(.)", "\\\\$1") + "]+)";
//[\ \!\"\'\,\;\:\.\-\_\?\)\(\[\]\<\>\*\#\t\n]
pattern = "\\b" + pattern + "|" + pattern + "\\b";
String text = ".\n<>#aword,... \n\t..# asecondword,?";
System.out.println( text.replaceAll(pattern, "") );
//awordasecondword
\b
用于单词边界。
首先,您应该将字符放入 [ ] (字符类)并转义特殊字符。
"\b" + 模式
用于主角和
模式 + "\b"
用于尾随字符。
一种从开头和结尾清除字符串中所有字符的方法(这应该比应用正则表达式模式更省时):
public class StringUtil {
private static final String PUNCTUATION = " !\"',;:.-_?)([]<>*#\n\t\r";
public static String strip(String original, String charsToRemove) {
if (original == null) {
return null;
}
int end = original.length();
int start = 0;
char[] val = original.toCharArray();
while (start < end && charsToRemove.indexOf(val[start]) >= 0) {
start++;
}
while (start < end && charsToRemove.indexOf(val[end - 1]) >= 0) {
end--;
}
return ((start > 0) || (end < original.length())) ? original.substring(start, end) : original;
}
}
像这样使用:
assertEquals("abc", StringUtil.strip(" !abc;-< ", StringUtils.PUNCTUATION));