SPL:文字处理
文字处理在任何一门程序语言中都是必不可少的,SPL提供了十分丰富的文字处理函数,分为字符处理、简单串处理、与序列相关、复杂分析等几大类,囊括字符串子串、判断、转换、字符编码、数据类型解析、查找替换、格式化、生成串、拆分、连接、正则表达式、单词与数字、SQL语句分析、HTML分析等各方面。
1. 字符处理
1.1 类型判断
目标 | 示例代码 | 返回值 |
是否全是数字 | isdigit(“12345”) | true |
是否全是字母 | isalpha(“abcde”) | true |
是否全小写 | islower(“aBcd”) | false |
是否全大写 | isupper(“ABCD”) | true |
1.2 转换
目标 | 示例代码 | 返回值 |
全部转成小写 | lower(“aB’cD’e”) | ab’cd’e |
转成小写时跳过引号内的串 | lower@q(“aB’cD’e”) | ab’cD’e |
全部转成大写 | upper(“aB’cD’e”) | AB’CD’E |
转成大写时跳过引号内的串 | upper@q(“aB’cD’e”) | AB’cD’E |
把行列号转成Excel式格名 | cellname(8,32) | AF8 |
1.3 字符编码
目标 | 示例代码 | 返回值 |
取第2个字符的unicode码 | asc(“abc”,2) | 98 |
取第1个字符的unicode码 | asc(“中国”) | 20013 |
取unicode码对应的字符 | char(98) | b |
取unicode码对应的字符 | char(22269) | 国 |
转成URL编码 | urlencode("a=b+c>0?1:-1","UTF-8") | a%3Db%2Bc%3E0%3F1%3A-1 |
解码URL编码 | urlencode@r(“a%3Db%2Bc”,”UTF-8”) | a=b+c |
字节数组转成BASE64串 | base64(bytes) | ixb7x1dxfbxefxff |
转成MD5加密串 | md5(“abcde”) | AB56B4D92B40713ACC5AF89985D4B786 |
1.4 数据类型解析
将字符串型的数据值解析成对应的数据类型。
目标 | 示例代码 | 返回值 |
数值串转成数值 | number("1234.56") | 1234.56 |
货币串转成数值 | number("$10,234.55","$#,###.#") | 10234.55 |
时间串解析成时间对象 | parse("10:20:30") | 时间对象 |
序列串解析成序列 | parse("[1,2,3]") | 序列[1,2,3] |
解析时去除引号和转义符 | parse@e("\"a\tb\"") | a b |
只解析开头的数字 | parse@n("123adsdx234") | 123 |
引号开头时解析到引号结束 | parse@q("\'sadsdxc\'+23") | sadsdxc |
1.5 格式化
目标 | 示例代码 | 返回值 |
数值转成格式化串 | string(12345.678,”#,##0.00”) | 12,345.68 |
日期转成格式化串 | string(date(“2020-03-15”),”MM/dd/yyyy”) | 03/15/2020 |
时间转成格式化串 | string(time(“16:18:54”),”h:mm a”) | 4:18 PM |
日期时间转成格式化串 | string(now(),”MM/dd/yyyy HH:mm”) | 2020-05-28 14:06 |
字符串两端加引号 | string@q(“ab cd”) | “ab cd” |
将字符转义 | string@e(“ab\”c d”) | ab\"c\td |
将字符转义,并将大字符集字符转成unicode | string@u(“ab\”c 中国”) | ab\"c\t\u4E2D\u56FD |
用参数解析串中的格式化子串 | format("The price is $%.2f",8.5) | The price is $8.50 |
2. 简单串处理
2.1 取子串
从源串中取出子串,使用mid、left、right函数,下表是些例子:
目标 | 示例代码 | 返回值 |
从第3个字符开始取 | mid(”abcdef”,3) | cdef |
从第3个字符开始取2个字符 | mid(”abcdef”,3,2) | cd |
取左边3个字符 | left(”abcdef”,3) | abc |
去掉最后2个字符 | left(”abcdef”,-2) | abcd |
取右边3个字符 | right(”abcdef”,3) | def |
去掉开头2个字符 | right(”abcdef”,-2) | cdef |
substr(s1,s2)
在源串s1中查找目标子串s2,找到后返回源串s1中子串s2所在位置前或后的子串,没找到返回null
目标 | 示例代码 | 返回值 |
取目标子串后面的子串 | substr(“abCDcdef”,”cd”) | ef |
取目标子串前面的子串 | substr@l(“abCDcdef”,”cd”) | abCD |
忽略大小写 | substr@c(“abCDcdef”,”cd”) | cdef |
跳过引号内的串 | substr@q(“ab\”acd\”cdef”,”cd”) | ef |
2.2 查找与匹配
pos(s1,s2{,begin})
在源串s1中查找目标子串s2的位置。找到后返回子串s2在源串s1中的开始位置,没找到返回null。
目标 | 示例代码 | 返回值 |
普通查找 | pos(”abcdef”,”aa”) | null |
普通查找 | pos(”abcDedefgh”,”de”) | 6 |
从第5个字符开始找 | pos(”abcdedefgh”,”de”,5) | 6 |
从后往前找 | pos@z(”abcdedefgh”,”de”) | 6 |
忽略大小写 | pos@c(”abcDedefgh”,”de”) | 4 |
只比较头部 | pos@h(”abcdefgh”,”ab”) | 1 |
只比较尾部 | pos@hz(”abcdefgh”,”fgh”) | 6 |
跳过引号内的串 | pos@q(”ab\”cde\”fcd”,”cd”) | 9 |
是否匹配格式串 | like("abc123", "abc*") | true |
匹配格式串时忽略大小写 | like@c("abc123", "ABC*") | true |
2.3 替换
replace(s,a,b)
将源串s中的子串a替换为字符串b,并返回替换后的s。
目标 | 示例代码 | 返回值 |
普通替换 | replace("abc’ab’deA","a","ss") | ssbc'ssb’deA |
只替换第1个 | replace@1("abc’ab’deA","a","ss") | ssbc'ab’deA |
忽略大小写 | replace@c("abc’ab’deA","a","ss") | ssbc'ssb’dess |
跳过引号内的串 | replace@q("abc’ab’deA","a","ss") | ssbc'ab’deA |
2.4 其他
目标 | 示例代码 | 返回值 |
n个源串拼成新串 | fill(“abc”,4) | abcabcabcabc |
删除串两端的空白符 | trim(" a bc ") | "a bc" |
删除串左端的空白符 | trim@l(" a bc ") | "a bc " |
删除串右端的空白符 | trim@r(" a bc ") | " a bc" |
删除串中多余的空白符 | trim@a(" a bc ") | "a bc" |
串前拼接另一个串到需要长度 | pad("Soth","Miss",10) | MissMiSoth |
串后拼接另一个串到需要长度 | pad@r("Soth","er",8) | Sotherer |
随机生成长度为11的数字串 | rands(“0123456789”,11) | 44238061662 |
3. 序列相关
3.1 拆分
s.split(d)
将字串s以分隔符d拆成序列,d省略拆成单字符。
目标 | 示例代码 | 返回值 |
用竖线拆分 | “aa|bb|cc”.split(“|”) | [aa,bb,cc] |
用逗号拆分 | "1,[a,b],(2,c),'5,6'".split@c() | [“1”,”[a,b]”,”(2,c)”,’5,6’] |
拆出第1个即停止 | "1,[a,b],(2,c),'5,6'".split@c1() | [“1”,”[a,b],(2,c),’5,6’”] |
拆分时忽略引号和括号 | "1,[a,b],(2,c),'5,6'".split@cb() | [“1”,”[a”,”b]”,”(2”,”c)”,”’5”,”6’”] |
拆分后解析各部分为对象 | "1,[a,b],(2,c),'5,6'".split@cp() | [1,[a,b],”(2,c)”,”5,6”] |
拆分后删除各部分两端空白 | “192 . 168 .0.3”.split@t(“.”) | [“192”,”168”,”0”,”3”] |
用数字(正则表达式)拆分 | "a1b2c57d".split@r("\\d") | [“a”,”b”,”c”,””,”d”] |
先用换行符拆分 行内再用split拆分 |
"s,a,y\ngood,morning".split@nc() | [[“s”,”a”,”y”],[“good”,”morning”]] |
3.2 连接
A.concat(d)
以分隔符d连接序列A中成员成为字符串,处理子序列,d省略直接连起来。
下表例子中A1为[1, ["a","b"],[2,"c"]]
目标 | 示例代码 | 返回值 |
无分隔符连接 | A1.concat() | 1[ab][2c] |
用冒号连接 | A1.concat(“:”) | 1:[a:b]:[2:c] |
用逗号连接 | A1.concat@c() | 1,[a,b],[2,c] |
连接串成员时加双引号 | A1.concat@q() | 1[“a””b”][2”c”] |
连接串成员时加单引号 | A1.concat@i() | 1[‘a’’b’][2’c’] |
两层序列连接时外层成员间换行,内层按concat连接 | [[1,2,3], ["a","b"],[2,"c"]].concat@n(“-“) | 1-2-3 a-b 2-c |
将参数连接成串,字符串成员不加引号 | concat(2,["a","b"],"cd") | 2abcd |
4. 复杂分析
4.1 正则表达式
目标 | 示例代码 | 返回值 |
与字符串匹配 | “4,23,a,test”.regex("(\\d),([0-9]*),([a-z]),([a-z]*)") | [“4”,”23”,”a”,”test”] |
与字符串匹配 | “4,23,a,test”.regex("(\\d),([a-z]),([0-9]*),([a-z]*)") | null |
字符串匹配时忽略大小写 | "a:Test:B".regex@c("([a-z]):([a-z])") | [“a”,”T”,”t”,”B”] |
正则表达式的规则可参考相关资料。
4.2 拆出单词和数字
下表例子中的s为"hi-10 hello!2020-01-01A8,3.14"
目标 | 示例代码 | 返回值 |
拆出串中的英语单词 | s.words() | [”hi”,”hello”,”A”] |
拆出串中的数字串 | s.words@d() | [”10”,”2020”,”01”,”01”,”8”,”3”,”14”] |
拆出串中的英语单词和数字 | s.words@a() | [”hi”,”10”,”hello”,”2020”,”01”,”01”,”A”,”8”,”3”,”14”] |
拆出所有字 | s.words@w() | [”hi”,”-”,”10”,” ”,”hello”,”!”,”2020”,”-”,”01”,”-”,”01”,”A”,”8”,”,”,”3”,”.”,”14”] |
拆出所有字, 数字开头部分将根据数据类型识别为数值或日期,拆成一个整体 | s.words@wp() | [”hi”,”-10”,” ”,”hello”,”!”,”2020-01-01”,”A”,”8”,”,”,”3.14”] |
连续英文和数字拆成一个词 | s.words@i() | [”hi”,”hello”,”A8”] |
4.3 SQL 语句分析
sql.sqlparse(part)
拆分SQL成为各个部分构成的序列,按照select语句、from语句(包含join部分)、where条件、group by语句、having语句、order by语句顺序将sql拆分成序列,拆分后的语法参数作为序列成员,结果返回序列。有part参数时,将part替换源SQL中的对应语法参数,结果返回新SQL。
下表例子中的sql为:
select emp.EID,emp.NAME,emp.BIRTHDAY,emp.SALARY,dep.DEPT,dep.MANAGER
from EMPLOYEE emp left join DEPARTMENT dep on emp.DEPT=dep.DEPT
where emp.EID<100 and dep.DEPT='R&D'
order by emp.SALARY,emp.EID
sql2为:select * from dept
目标 | 示例代码 | 返回值 |
获取SQL语句各部分 | sql.sqlparse() | 略,参看函数帮助 |
获取select子句 | sql.sqlparse@s() | emp.EID,emp.NAME,emp.BIRTHDAY,emp.SALARY,dep.DEPT,dep.MANAGER |
获取from子句 | sql.sqlparse@f() | EMPLOYEE emp left join DEPARTMENT dep on emp.DEPT=dep.DEPT |
获取where子句 | sql.sqlparse@w() | emp.EID<100 and dep.DEPT='R&D' |
获取group by子句 | sql.sqlparse@g() | null |
获取having子句 | sql.sqlparse@h() | null |
获取order by子句 | sql.sqlparse@o() | emp.SALARY,emp.EID |
获取SQL各部分并将各部分中多项再拆成序列 | sql.sqlparse@a() | 略,参看函数帮助 |
替换select子句 | sql2.sqlparse@s(“deptid”) | select deptid from dept |
替换from子句 | sql2.sqlparse@f(“sales”) | select * from sales |
将SQL语句转换成特定数据库的SQL语句 | sql.sqltranslate(“MYSQL”) | 略 |
4.4 分节串
分节串就是指常见的key、value字符串,SPL中默认的分节串key与value间用等号连接,各分节间用空格隔开。
xs.property(n,v)
从分节串xs中读取名为n的节的值返回,有字符串v时设置n的值为v,v为空时删除n
下表例子中的xs为:color=red size=20 price=500
目标 | 示例代码 | 返回值 |
获取所有属性构成的2列序表 | xs.property() | 略 |
获取指定属性值 | xs.property(“size”) | “20” |
给取得的属性值加上引号 | xs.property@q(“size”) | “\”20\”” |
解析取得的属性值为相应类型 | xs.property@v(“size”) | 20 |
修改属性值 | xs.property(“size”,”30”) | color=red size=30 price=500 |
删除属性 | xs.property(“size”,null) | color=red price=500 |
逗号或分号分隔的分节串 | “color=red;size=30“.property@cv(“size”) | 30 |
属性与值间用冒号连接的分节串 | “color:red size:30“.property@j(“size”) | “30” |
4.5 HTML 串
s.htmlparse(tag:i:j,…)
获取html串s中第i个tag下的第j个文本,无参数时取出其下所有文本。
下表例子中的html为:
<div><div>aaa<div>bbb<span>ccc</span>ddd</div></div></div>
<table><tr><td>1</td><td>2</td><td>3</td></tr>
<tr><td>a</td><td>b</td><td>c</td></tr>
</table>
目标 | 示例代码 | 返回值 |
获取第3个div的第3个文本 | html.htmlparse("div":2:2) | ddd |
获取第2个div的第1个文本及第1个span的第1个文本 | html.htmlparse("div":1:0,"span":0:0) | [aaa,ccc] |
获取第1个table的内容 | html.htmlparse("table":0) | [[1,2,3],[a,b,c]] |
更多文字处理请参阅SPL资料中的字符串函数。