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”] |
先用换行符拆分 |
"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 |
将参数连接成串,字符串成员不加引号 |
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资料中的字符串函数。