识别目标字符对于短字符关键词的判断逻辑

51 阅读1分钟

要求:短字符关键词在目标字符中独立存在(两边均必须只能是字符边界,即非字母或者数字)

例1: 目标字符:AIDFYE 关键词:YE 返回:否; 目标字符YE左侧有字母F接壤

例2: 目标字符:GF&YE 关键词:YE 返回:是; 目标字符匹配到关键词YE,且右侧为字符边界,左侧为符号&(非字母或者数字)

/**
 * 判断目标字符串是否包含关键词(只针对短字符)
 *
 * @param keyWord
 * @param target
 * @return
 */
private Boolean ifCharacterBoundary(String keyWord, String target) {
    // 不包含关键词
    if (!target.contains(keyWord)) {
        return Boolean.FALSE;
    }
    // 与关键词完全相等
    if (target.equals(keyWord)) {
        return Boolean.TRUE;
    }

    // 目标字符以关键词结尾
    if (target.endsWith(keyWord)) {
        int endIndex = target.length() - keyWord.length();
        if (!endsWithLetterOrDigit(target.substring(0, endIndex))) {
            return Boolean.TRUE;
        }
    }
    // 以关键词为参数,分割目标字符
    // 若字符数组中,第i个元素不以字母或者数字结尾,且第i+1个元素不以字母或者数字开头,返回true
    String[] splitArray = target.split(keyWord);
    for (int i = 0; i < splitArray.length - 1; i++) {
        if (!endsWithLetterOrDigit(splitArray[i]) && !startsWithLetterOrDigit(splitArray[i + 1])) {
            return Boolean.TRUE;
        }
    }
    return Boolean.FALSE;
}

/**
 * 判断目标字符是否以字母或者数字结尾
 *
 * @param info
 * @return
 */
private boolean endsWithLetterOrDigit(String info) {
    if (StringUtil.isBlank(info)) {
        return false;
    }
    return info.matches(".*[a-zA-Z0-9]");
}

/**
 * 判断目标字符是否以字母或者数字开头
 *
 * @param info
 * @return
 */
private boolean startsWithLetterOrDigit(String info) {
    if (StringUtil.isBlank(info)) {
        return false;
    }
    return info.matches("^[a-zA-Z0-9].*");
}