public final class Chars {
/** ASCII 字符表长度,可直接用于“按字符值分桶”的 {@code boolean[]} 标记表 */
public static final int ASCII_SIZE = 128;
// ==================== 空白与换行 ====================
/** 空格 */
public static final char SPACE = ' ';
/** 水平制表符 */
public static final char TAB = '\t';
/** 换行符 */
public static final char LINE_FEED = '\n';
/** 回车符 */
public static final char CARRIAGE_RETURN = '\r';
/** 换页符 */
public static final char FORM_FEED = '\f';
/** 常见空白字符拼接成的字符串,可直接用于 {@code trim()} / 正则等场景 */
public static final String WHITESPACE_STRING = " \t\n\r\f";
/** 常见空白字符 */
public static final char[] WHITESPACE_CHARS = {SPACE, TAB, LINE_FEED, CARRIAGE_RETURN, FORM_FEED};
// ==================== 标点与运算符 ====================
/** 英文逗号 */
public static final char COMMA = ',';
/** 英文句点 */
public static final char DOT = '.';
/** 冒号 */
public static final char COLON = ':';
/** 分号 */
public static final char SEMICOLON = ';';
/** 问号 */
public static final char QUESTION_MARK = '?';
/** 感叹号 */
public static final char EXCLAMATION_MARK = '!';
/** 竖线 */
public static final char PIPE = '|';
/** 与号 */
public static final char AMPERSAND = '&';
/** 等号 */
public static final char EQUALS_SIGN = '=';
/** 加号 */
public static final char PLUS = '+';
/** 减号 / 连字符 */
public static final char MINUS = '-';
/** 星号 */
public static final char ASTERISK = '*';
/** 斜线 */
public static final char SLASH = '/';
/** 反斜线 */
public static final char BACKSLASH = '\\';
/** 下划线 */
public static final char UNDERSCORE = '_';
/** 百分号 */
public static final char PERCENT = '%';
/** 井号 */
public static final char HASH = '#';
/** at 符号 */
public static final char AT_SIGN = '@';
/** 美元符号 */
public static final char DOLLAR = '$';
/** 脱字符 */
public static final char CARET = '^';
/** 波浪号 */
public static final char TILDE = '~';
// ==================== 引号 ====================
/** 双引号(JSON 字符串) */
public static final char DOUBLE_QUOTE = '"';
/** 单引号(SQL、日志常见) */
public static final char SINGLE_QUOTE = '\'';
/** 反引号(SQL 标识符、模板串) */
public static final char BACKTICK = '`';
/** 常见引号字符 */
public static final char[] QUOTE_CHARS = {DOUBLE_QUOTE, SINGLE_QUOTE, BACKTICK};
// ==================== 括号 ====================
/** 左圆括号 */
public static final char LEFT_PARENTHESIS = '(';
/** 右圆括号 */
public static final char RIGHT_PARENTHESIS = ')';
/** 左方括号 */
public static final char LEFT_BRACKET = '[';
/** 右方括号 */
public static final char RIGHT_BRACKET = ']';
/** 左花括号 */
public static final char LEFT_BRACE = '{';
/** 右花括号 */
public static final char RIGHT_BRACE = '}';
/** 左尖括号 */
public static final char LEFT_ANGLE = '<';
/** 右尖括号 */
public static final char RIGHT_ANGLE = '>';
/** 左括号:([{ */
public static final char[] OPENING_BRACKETS = {LEFT_PARENTHESIS, LEFT_BRACKET, LEFT_BRACE};
/** 右括号:}])(可作为容器闭合判断依据) */
public static final char[] CLOSING_BRACKETS = {RIGHT_PARENTHESIS, RIGHT_BRACKET, RIGHT_BRACE};
/** 尖括号 */
public static final char[] ANGLE_BRACKETS = {LEFT_ANGLE, RIGHT_ANGLE};
/** 全部括号 */
public static final char[] BRACKETS = {LEFT_PARENTHESIS, RIGHT_PARENTHESIS, LEFT_BRACKET, RIGHT_BRACKET,
LEFT_BRACE, RIGHT_BRACE, LEFT_ANGLE, RIGHT_ANGLE};
// ==================== 标记表(快路径) ====================
private static final boolean[] WHITESPACE_FLAGS = asciiFlags(WHITESPACE_CHARS);
private static final boolean[] QUOTE_FLAGS = asciiFlags(QUOTE_CHARS);
private static final boolean[] OPENING_BRACKET_FLAGS = asciiFlags(OPENING_BRACKETS);
private static final boolean[] CLOSING_BRACKET_FLAGS = asciiFlags(CLOSING_BRACKETS);
private static final boolean[] ANGLE_BRACKET_FLAGS = asciiFlags(ANGLE_BRACKETS);
private static final boolean[] BRACKET_FLAGS = asciiFlags(BRACKETS);
private Chars() {
}
// ==================== 判断方法 ====================
/**
* 是否为空白字符:ASCII 空白(空格、{@code \t \n \r \f})或 {@link Character#isWhitespace(char)} 认定的空白
*/
public static boolean isWhitespace(char c) {
return (c < ASCII_SIZE && WHITESPACE_FLAGS[c]) || Character.isWhitespace(c);
}
/**
* 是否为换行符({@code \n} 或 {@code \r})
*/
public static boolean isLineBreak(char c) {
return c == LINE_FEED || c == CARRIAGE_RETURN;
}
/**
* 是否为引号字符,见 {@link #QUOTE_CHARS}
*/
public static boolean isQuote(char c) {
return c < ASCII_SIZE && QUOTE_FLAGS[c];
}
/**
* 是否为左括号:{@code ( [ \{}
*/
public static boolean isOpeningBracket(char c) {
return c < ASCII_SIZE && OPENING_BRACKET_FLAGS[c];
}
/**
* 是否为右括号:{@code ) ] \}}
*/
public static boolean isClosingBracket(char c) {
return c < ASCII_SIZE && CLOSING_BRACKET_FLAGS[c];
}
/**
* 是否为尖括号:{@code < >}
*/
public static boolean isAngleBracket(char c) {
return c < ASCII_SIZE && ANGLE_BRACKET_FLAGS[c];
}
/**
* 是否为任意括号,见 {@link #BRACKETS}
*/
public static boolean isBracket(char c) {
return c < ASCII_SIZE && BRACKET_FLAGS[c];
}
// ==================== 通用小工具 ====================
/**
* 生成 ASCII 标记表:下标即字符值,{@code char >= ASCII_SIZE} 的字符会被忽略
* (非 ASCII 字符只有少数几种,通常用线性比较更划算)
*/
public static boolean[] asciiFlags(char... chars) {
boolean[] flags = new boolean[ASCII_SIZE];
if (chars != null) {
for (int i = 0; i < chars.length; i++) {
if (chars[i] < ASCII_SIZE) {
flags[chars[i]] = true;
}
}
}
return flags;
}
}
版权归属:
天明
许可协议:
本文使用《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》协议授权
评论区