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   取子串

从源串中取出子串,使用midleftright函数,下表是些例子:

目标 示例代码 返回值
从第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   分节串

分节串就是指常见的keyvalue字符串,SPL中默认的分节串keyvalue间用等号连接,各分节间用空格隔开。

xs.property(n,v)

从分节串xs中读取名为n的节的值返回,有字符串v时设置n的值为vv为空时删除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,)

获取htmls中第itag下的第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>

目标 示例代码 返回值
获取第3div的第3个文本 html.htmlparse("div":2:2) ddd
获取第2div的第1个文本及第1span的第1个文本 html.htmlparse("div":1:0,"span":0:0) [aaa,ccc]
获取第1table的内容 html.htmlparse("table":0) [[1,2,3],[a,b,c]]

 

 

更多文字处理请参阅SPL资料中的字符串函数。