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资料中的字符串函数。