如何在FileMaker中提取去除前6字符后首字母前的数字?
FileMaker 提取序列号指定数字部分的正确写法
需求
处理Serial Number字段,完成以下三步:
- 移除字段值的前6个字符
- 提取第一个大写字母(A-Z)出现之前的所有数字部分
- 将提取内容转换为数字类型
示例: - 输入
15266R16S12P2→ 输出16 - 输入
12345P382M45→ 输出382
你之前代码的问题
Position函数不支持正则表达式(如[A-Z])作为匹配条件,无法批量查找字母- 枚举单个字母的方式覆盖不全,且无字母的边缘场景处理逻辑有误
正确实现
方案1:原生函数组合(兼容所有FileMaker版本)
无需循环,通过Filter和Position组合实现:
Let ( [ stripped = Right ( Serial Number ; Length ( Serial Number ) - 6 ) ; all_letters = Filter ( stripped ; "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ) ; first_letter_pos = If ( not IsEmpty ( all_letters ) ; Position ( stripped ; Left ( all_letters ; 1 ) ; 1 ; 1 ) ; Length ( stripped ) + 1 ) ; num_part = Left ( stripped ; first_letter_pos - 1 ) ] ; GetAsNumber ( num_part ) )
方案2:While循环(FileMaker 16及以上版本,逻辑更直观)
通过循环逐个检查字符,定位第一个字母的位置:
Let ( [ stripped = Right ( Serial Number ; Length ( Serial Number ) - 6 ) ; total_len = Length ( stripped ) ; pos = 1 ; found_letter = False ] ; While ( pos ≤ total_len and not found_letter ; [ curr_char = Middle ( stripped ; pos ; 1 ) ; found_letter = PatternCount ( "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ; curr_char ) > 0 ; pos = pos + 1 ] ; GetAsNumber ( Left ( stripped ; pos - ( If ( found_letter ; 2 ; 1 ) ) ) ) ) )
方案说明
- 方案1通过
Filter一次性提取所有大写字母,避免枚举遗漏;用IsEmpty判断是否存在字母,完美处理无字母的边缘场景 - 方案2循环逻辑清晰,代码紧凑,适合复杂字符匹配需求
- 最终通过
GetAsNumber转换数字类型,自动忽略前导/后导空格,容错性强
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

