字符串处理集

字符串处理集是一系列针对于字符串做局部调整的函数集合,运用它可以在不丢掉链式特性的情况下优雅的进行字符串的二次处理。具体demo相信你在上一个章节里面有见到。现在具体讲解字符串函数集。

字符串处理函数这里简称:StringFunction, 他是我设计的一种表达式,所谓表达式即可以组合表达式规则实现复杂的功能。StringFunction目前的实现支持函数、函数嵌套、函数传参、以及简单数字计算。其中数字计算只支持四则运算和取模运算。如一下简单的表达式样例:

  1. trim("123后面两个空格 ") 这是一个基本的函数表达式,他有一个函数名称trim,以及一个字符串参数:"123后面两个空格 ",这个函数的计算结果就是:"123后面两个空格",也即后面的空格会被trim函数干掉。
  2. subString("这是输入字符串",length("这是")+1)这是一个比较复杂的函数,他设计到函数嵌套、以及数字加法。这个表达式的计算结果是:入字符串,首先,表达式整体是一个字符串裁剪函数:subString,第一个参数原字符串,第二个参数是起始长度。然后,第二个参数是函数和数字组合的加法运算。也即"这是"的长度加1作为裁剪函数的裁剪起始函数。

这个时候,我想你应该了解StringFunction是干嘛的了吧。StirngFunction功能其实挺强大的(后续还会接入awk,这就算是一门语言的植入了),同时StirngFunction不会有性能问题,在执行的时候,他转化为计算模型,而且表达式本身不是语言,没有变量、堆栈开销。

当前已经支持的函数

当前大部分函数迁移自common-lang3的StringUtils,但是不是所有都迁移了,这里仅仅列举迁移过的函数名称,具体文档参考common-lang3。这是文档:http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/StringUtils.html

已支持函数列表:capitalize,deleteWhitespace,endsWith,indexOf,indexOfIgnoreCase,isAllLowerCase,isAllUpperCase,isAlpha,isAlphanumeric,isAlphanumericSpace,isAlphaSpace,isAsciiPrintable,isNumeric,isNumericSpace,join,lastIndexOf,lastIndexOfIgnoreCase,length,lowerCase,remove,removeAll,removeEnd,removeEndIgnoreCase,removeFirst,removeIgnoreCase,removePattern,removeStart,removeStartIgnoreCase,replaceAll,replaceFirst,replaceOnce,replaceOnceIgnoreCase,replacePattern,reverse,split,splitByWholeSeparator,startsWith,substring,substringsBetween,swapCase,trim,trimToEmpty,truncate,uncapitalize,upperCase。

初步看了看,大概46个。

vs内置函数

也有部分函数是我单独增加的,包含如下:

regex 正则表达式抽取,和webmagic内置的regex抽取器含义类似,不过在vs中,regex是作为一个字符串函数存在。它包含三个参数,分别是原始文本、正则表达式、group。其作用就是使用正则表达式抽取原始文本中的数据。然后选取goup的内容,然后goup是可选参数,如果不传递,则使用第0号group
self self是一个非常特殊的函数,她代表这表达式外部输入。他的地位类似java的System.in。因为这些函数的输入都是各种参数,但是我们处理的内容源,肯定是链式表达式抽取过程中,上一个抽取节点的结果,作为StringFucntion的输入啊,self就是一个对接上一个节点的管道函数。任何时候,只要调用"self()",其返回结果则是上一个抽取节点的输入字符串。
test test也挺特殊的,他用来实现条件判断,你猜的没错。Stringfunction支持分支计算,可以通过test函数实现if判断。当然这个毕竟是表达式,if支持会比较不好看,就是不建议用它实现太复杂的逻辑(当然你愿意也是可以的)。简单来说,test函数是一个三目表达式的实现,他有三个参数。第一个必须是boolean类型的返回值,第二个和第三个是任意类型。其计算结果就是,如果第一个参数的值是true,则本函数返回第二个参数的值,否则返回第三个参数的返回值,demo:test(isEmpty(a),b,c) 如果a为空,则返回b;如果a不为空,返回c

函数扩展

作为一个框架,最好的思想就是提供一套基础组件,然后基础组件没有业务逻辑,所有功能都是在这个基础组件上面实现的扩展。甚至框架本身的核心功能也是以插件的形式继承到系统,保证默认实现没有任何优先级特权,任何一个默认实现都可以作为扩展参考所需要的demo。这个思想在VS抽取器系列(包括SipSoup、链式抽取器、字符串函数)特别明显:如果你需要实现扩展一个函数,只需要实现这个接口:com.virjar.vscrawler.core.selector.string.function.StringFunction 然后使用如下方法注册:com.virjar.vscrawler.core.selector.string.function.StringFunctionEnv#register 他是一个静态函数,调用即可生效。放心,上面所有提到的函数都是通过这个方式注册到系统,每一个函数都是demo,我这里就不列举了。祝你好运

results matching ""

    No results matching ""