在java及js中转换全角到半角字符

java实现:
/**
     * 把字符串中的全角字符串转换成半角字符串
     * 如果仅有半角字符串,则不变
     * @param str
     * @return
     */
    public static String Q2BChange(String str){
        String result = "";
        int  code = 0;
        String inputStr = str.replaceAll("^[ | ]*","").replaceAll("[ | ]$","").replaceAll("[ | ]","");
        for(int i=0;i<inputStr.length();i++){
            code = inputStr.codePointAt(i);
            System.out.println(code);
            if(code>=65281 && code<65373){
                //“65248”是转换码距
                result += new String(new int[]{ code-65248 },0,1);
            } else {
                result += inputStr.charAt(i);
            }
        }
        return result;
    }

js实现(这个在网上找来的,但是那个里面有太多错误):
function DBC2SBC(str) {
        var i;
        var result='';
        for(i=0;i<str.length;i++){
        // “65281”是“!”,“65373”是“}”
        code=str.charCodeAt(i);
        if(code>=65281 && code<65373)
             // “65248”是转换码距
             result += String.fromCharCode( str.charCodeAt(i)-65248 );
        else
             result += str.charAt(i);
        }
        return result;
    }
def _parse_chapter_id(self, text_content: str) -> Union[str, None]: """ 解析文本段落中的章节编号 修复点:在pattern2匹配中也添加过滤逻辑 """ # 保留原始文本用于后续检查 original_text = text_content # 替换全角字符半角 text_content = ( text_content .replace("\u3000", " ") # 全角空格 → 半角空格 .replace(".", ".") # 全角句点 → 半角句点 ) # 改进正则表达式:支持全角数字开头 pattern1 = r"^(?:\s|\u3000)*([\d0-9]+(?:\.[\d0-9]+)*)[\s.、]+([^\d\s].*)$" match_result = re.findall(pattern1, text_content) def is_valid_title(title: str, original: str) -> bool: """验证标题是否合法""" # 必须包含日文字符 japanese_chars = r"\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FAF" if not re.search(f"[{japanese_chars}]", title): return False # 技术标识符过滤 tech_patterns = [ r"\bSID\s*0x[0-9A-Fa-f]{2,}\b", # SID后跟十六进制 r"\b[A-Z]{2,}\d{2,}\b", # 大写字母+数字组合 r"\b0x[0-9A-Fa-f]{2,}\b", # 十六进制标识符 r"\([^\u3040-\u30FF\u4E00-\u9FAF]+\)" # 非日文字符的括号内容 ] if any(re.search(pattern, original, re.I) for pattern in tech_patterns): return False # 非法关键词检查 invalid_keywords = ["inch:", "imch:", "SID", "0x"] invalid_pattern = r"(" + "|".join(map(re.escape, invalid_keywords)) + r")\s*" if re.search(invalid_pattern, original, re.I): return False return True if match_result and match_result[0]: chapter_id_raw = match_result[0][0] title_part = match_result[0][1].strip() # 将全角数字转换半角数字 full_to_half = str.maketrans('0123456789', '0123456789') chapter_id = chapter_id_raw.translate(full_to_half) # 验证标题合法性 if not is_valid_title(title_part, original_text): return None # 格式化章节ID chapter_id = chapter_id.replace("、", ".").strip(".") return chapter_id # 尝试匹配无分隔符的格式(如"1.概要") pattern2 = r"^(?:\s|\u3000)*([\d0-9]+)\.([^\d\s].*)$" match_result2 = re.findall(pattern2, original_text) if match_result2 and match_result2[0]: chapter_id_raw = match_result2[0][0] title_part = match_result2[0][1].strip() # 将全角数字转换半角数字 full_to_half = str.maketrans('0123456789', '0123456789') chapter_id = chapter_id_raw.translate(full_to_half) # 验证标题合法性 - 添加与pattern1相同的过滤逻辑 if not is_valid_title(title_part, original_text): return None return chapter_id return None 只接受1.概要格式,要有.,不接受9 走行モードアンビエント这种
11-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值