正则表达式优化:排除与孟加拉语字母衔接的数字匹配
解决孟加拉数字正则匹配误抓问题
问题分析
原正则表达式[০১২৩৪৫৬৭৮৯]+\.[০১২৩৪৫৬৭৮৯]+|[০১২৩৪৫৬৭৮৯]+(注意原表达式中未转义的.会匹配任意字符,需修正为\.)会误匹配与孟加拉语字母(如তম、টি)衔接的数字(例如২১তম中的২১、১০টি中的১০),需求是仅匹配独立的纯孟加拉数字(如১০৫、৭৬)和带小数点的孟加拉数字(如১০৫.৫৬),排除与指定孟加拉语字符/词汇衔接的数字。
修正后的正则表达式
(?<!তম|টি|[\p{Bengali}])[০১২৩৪৫৬৭৮৯]+(?:\.[০১২৩৪৫৬৭৮৯]+)?(?![\p{Bengali}])
规则解释
(?<!তম|টি|[\p{Bengali}]):负向回顾后瞻,确保数字前不是指定的孟加拉语词汇(তম、টি)或任意孟加拉语字符,避免匹配前缀衔接的数字[০১২৩৪৫৬৭৮৯]+:匹配1个及以上孟加拉数字(?:\.[০১২৩৪৫৬৭৮৯]+)?:可选的小数部分,(?:...)为非捕获组,\.匹配小数点,后续匹配1个及以上孟加拉数字,?表示该部分可省略(?![\p{Bengali}]):负向先行断言,确保数字后不是任意孟加拉语字符,避免匹配后缀衔接的数字
测试验证
在regex101.com选择**PCRE2(PHP >=7.3)**引擎测试:
- 匹配成功的示例:
১০৫、৭৬、১০৫.৫৬、৪৫.৭ - 匹配被排除的示例:
২১তম(不会捕获২১)、১০টি(不会捕获১০)
内容的提问来源于stack exchange,提问作者Ishrat Hossain
相关产品推荐
相关产品推荐

