1. 基础正则表达式

1.1 特殊字符

  • ^$: 表示从字符串头/尾开始匹配,做全字符串匹配时一般不会用,但是做替换匹配时加上,则非常有用。
val pattern = Pattern.compile("^work") //其实就是全匹配
val input1 = "work" // true
val input2 = "wor" // false
val input3 = "working" // false

val replace = "112345"
val result1 = replace.replaceAll("[1-9]{2}", "Z") // "ZZZ",正则项表示两个连续非零数字
val result2 = replace.replaceAll("^[1-9]{2}", "Z") // "Z2345"
val result3 = replace.replaceAll("[1-9]{2}$", "Z") // "1123Z"
  • *+?:表示匹配表达式的次数,分别为匹配0-n次,匹配1-n次和匹配0-1次。
val pattern1 = Pattern.compile("work[1-9]*") // true,有0-n个1-9的数字
val pattern2 = Pattern.compile("work[1-9]?") // false,有0-1个1-9的数字
val pattern3 = Pattern.compile("work[1-9]+") // true,有1-n个1-9的数字
val input1 = "work12345"

  • {n}{n,}{n,m}:表示匹配n次,至少匹配n次,至少匹配n次但至多匹配m次。
val pattern1 = Pattern.compile("work[1-9]{4}}") // true,有4个1-9的数字
val pattern2 = Pattern.compile("work[1-9]{5}") // false,有5个1-9的数字
val pattern3 = Pattern.compile("work[1-9]{2,}") // true,至少有2个1-9的数字
val pattern4 = Pattern.compile("work[1-9]{2,3}") // false,有2-3个1-9的数字
val pattern5 = Pattern.compile("work[1-9]{2,6}") // true,有2-6个1-9的数字
val input1 = "work12345"

1.2 功能字符

  • x|y[xy][^xy]:表示匹配x或y,匹配x和y,匹配不属于x和y。

  • \b\B\d\D(均需要转义):表示匹配单词边界,匹配非单词边界,匹配一个数字,匹配一个非数字

val input = "HardWork eWork1234 eWorkHard"
println(input.replaceAll("rk\\b", "Z")) // HardWoZ eWork1234 eWorkHard
println(input.replaceAll("rk\\B", "Z")) // HardWork eWoZ1234 eWoZHard
println(input.replaceAll("rk\\d", "Z")) // HardWork eWoZ234 eWorkHard
println(input.replaceAll("rk\\D", "Z")) // HardWoZeWork1234 eWoZard,空格也属于非数字
println(input.replaceAll("rk[^\\d|\\s]", "Z")) // HardWork eWork1234 eWoZard,替换跟着的不是数字且不是空格的rk为Z

2. 应用

2.1 特征

特征是机器学习里非常常用的一个概念,一个特征往往有主键和副键之分,表示一个特征时用{主键pk.副键sk}的样子来表示,正则表达式如下:

\\{.+\\..+\\}

2.2 交叉特征

特征之间做交叉是为了体现特征之间的关系而产生的新特征,例如点积交叉、乘积交叉等。表示为{特征1}{交叉符号}{特征2},正则表达式如下:

\\{.+\\..+\\}\\*\\{.+\\..+\\}