index查找子串,scan查找属于给定字符集合的字符,verify查找不属于给定字符集合的字符;找不到时三者都返回0。它们常用于解析配置行、定位分隔符和验证数字文本;适合结构较简单的字符记录,并可与子串配合提取字段。
语法结构
position = index(string, substring [, back])
position = scan(string, set [, back])
position = verify(string, set [, back])
- index返回substring第一次出现的起始位置;back=.true.时从结果意义上选择最后一次出现。
- scan把set看成字符集合,返回string中第一个属于该集合的字符位置。
- verify执行相反检查,返回第一个不属于set的字符位置;返回0表示所有字符都通过集合验证。
本文代码
! 从配置记录中查找分隔符、数字和非法字符。
program characterSearchDemo
implicit none
character(len=32) :: configLine
character(len=8) :: method, stepText
character(len=4) :: invalidStepText
integer :: equalPosition, separatorPosition, firstDigit
configLine = "method=rk4;steps=1200"
equalPosition = index(configLine, "=")
separatorPosition = index(configLine, ";")
firstDigit = scan(configLine, "0123456789")
method = configLine(equalPosition + 1:separatorPosition - 1)
stepText = configLine(index(configLine, "steps=") + 6:len_trim(configLine))
invalidStepText = "12O0"
print "(A,I0)", "等号位置:", equalPosition
print "(A,I0)", "分号位置:", separatorPosition
print "(A,I0)", "首个数字位置:", firstDigit
print "(A,A)", "积分方法:", trim(method)
print "(A,A)", "步数文本:", trim(stepText)
print "(A,I0)", "1200中的非法字符位置:", &
verify(trim(stepText), "0123456789")
print "(A,I0)", "12O0中的非法字符位置:", &
verify(invalidStepText, "0123456789")
end program characterSearchDemo
编译运行
(base) hong@hongdeMacBook-Pro 059.characterSearch % gfortran -Wall -Wextra -std=f2018 exampleCharacterSearch.f90 -o characterSearchDemo
(base) hong@hongdeMacBook-Pro 059.characterSearch % ./characterSearchDemo
等号位置:7
分号位置:11
首个数字位置:10
积分方法:rk4
步数文本:1200
1200中的非法字符位置:0
12O0中的非法字符位置:3
现象分析
method=rk4;steps=1200中,第7个字符是等号,第11个字符是分号,因此二者之间的record(8:10)为rk4。
scan从左到右寻找任意数字。rk4中的4位于整条记录第10位,所以首个数字位置是10,而不是步数字段的起点。
verify用0123456789验证步数文本。1200的每个字符都在集合中,因此返回0;12O0的第3个字符是字母O,不在数字集合中,因此返回3。
核心知识点
- index查子串,scan查集合内字符,verify查集合外字符。
- 返回值是从1开始的位置,0表示没有找到目标。
- 可选back=.true.用于取得最右侧匹配。
- verify返回0是全部合法,不是第0个字符。