正则表达式匹配中文数字 一亿三千五百万这种,请问怎么写,主要中间可能会有零出现,就比较难搞,
不一定需要一个正则表达式实现,可以配合别的东西,有没有办法识别出来
中文不太好写,没有通配符,试试这样:
([零一二三四五六七八九十]{0,1}[亿万千百]?[亿万]?)+
/[一二三四五六七八九][零一二三四五六七八九十百千万亿]*/g
一百二万九九九零
这种乱七八糟的也能匹配到,从中文读数字的规范去匹配的话,[十百千万亿]
[1-9][十]
的话,后面要么结束,要么匹配[万亿]
,要么接[1-9]
[1-9][十][万]
,后面要么结束,否则接零
,要么接[1-9]
[1-9][十][万][零]
,再后面结束(个位),或者[千百十]一三五四九万十百
这种,直接正则也不是不能实现,但是太冗杂,最好写个回调函数,因为很多地方可复用,比如【一百一十一万】前面的逻辑和【一百一十一】是一样的,部分又和【一十一】一直,写个递归回调函数之类的会方便很多。import re
# 有完整的格式比如左右有明确标识ab
a = "a一亿三千五百零六万b"
find = re.compile("a(.+?)b")
print(find.findall(a))
# 没有固定格式的,要求被搜索内容本身格式要固定
# 这个是有缺陷的答案,需要你自己再修改
# 开头肯定是零到十之间,出现时就搜集
# 目前缺少一个标识会导致其他的也会被收集进来,查找一下源文件看看有没有标识
# 你可以在最后添加你找到的标识或者是拿到列表后遍历并通过标识给区分开
b = "as一二三de一亿三千五百零六万零七resdf八千gf九百万g"
find2 = re.compile("([零一二三四五六七八九十]+?[个十百千万亿]*[零一二三四五六七八九十]*)")
print(find2.findall(b))
print("".join((find2.findall(b))))
结果:
['一亿三千五百零六万']
['一二三', '一亿三', '五百零六', '零七', '八千', '九百万']
一二三一亿三五百零六零七八千九百万
随便写了一下,描述的稍微有点笼统不知道要避免什么样的格式,比如”一二三”这种连起来的,也比如“五百千”(正常应该是“五十万”)这种没有进位的,所以没有深入去写,就避免了数字之间的连续,其实单位的连续也可以避免只要记录一下之前的字符就行,我懒得写了,而且这个写的也比较随便,我的思路大概是这个思路。
以上仅供参考,有什么问题或者想法可以一起讨论,看有没有别的方法替代
public static int isNumber(String a, Boolean isType) {
String one = "零一二三四五六七八九十";
String two = "亿万千百十";
if (isType) {
//属于返回2,不属于返回0
return one.contains(a) ? 2 : isNumber(a, false);
} else {
return two.contains(a) ? 1 : 0;
}
}
public static boolean splitString(String str) {
int isType = 1;
boolean result = true;
//没有判空,正常情况下应该判空
String[] split = str.split("");
for (String s : split) {
int number = isNumber(s, isType == 1);
if (number != 0) {
isType = number;
} else {
result = false;
break;
}
}
return result;
}
public static void main(String[] args) {
String str = "一亿三千五百万";
System.out.println(splitString(str));//true
String str2 = "一亿亿三千千五百百万万";
System.out.println(splitString(str2));//true
String str3 = "一一亿亿三三千千五五百百万万";
System.out.println(splitString(str3));//false
}
String regEx = "^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341]";
注意观察需要转义的字符