Scala/Java 中 字符串split 按非正则表达式分割
scala/java中,str.split(regex)
分割是按照正则表达式来分割的,有时我们仅希望按原样分割。
import java.util.regex.Pattern
val c="任意字符串"//用于分割的字符串
str.split(Pattern.quote(c)) //即可
方法解释
在使用quote()方法之后,原有的字符串s变成了\Qs\E
的样式:
\Q 代表字面内容的开始
\E 代表字面内容的结束
也就是说,调用Patter.quote()
方法之后,原有的字符串被\Q..\E
包裹,返回后的字符串成了正则字面量。
举个例子,正则表达式”.”表示匹配除“\n”之外的任何字符:
val str="abc.cd"
str.split(".")//返回空数组 Array()
str.split(Pattern.quote(".")) //返回 Array(abc, cd)
不以某字符串开头或结尾
(?:str) 非捕获组
(?=str) 肯定式向前查找
(?!str) 否定式向前查找
(?<=str) 肯定式向后查找
(?<!str) 否定式向后查找
参考:
https://segmentfault.com/a/1190000019266662
其他
\w 匹配 字母和数字,等同于 [a-zA-Z0-9]。
\b 是正则表达式规定的一个特殊代码,代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是 \b 并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。
\b\w+\b 匹配所有单词,不包含空格
解决:java.lang.IllegalArgumentException: Illegal group reference
当使用String中的replaceAll方法时,如果替换的值中包含有$符号时,在进行替换操作时会出现如下错误。
"AABB".replaceAll("AA","$dd")
java.lang.IllegalArgumentException: Illegal group reference
at java.util.regex.Matcher.appendReplacement(Matcher.java:857)
解决方法(加转义字符\
):
"AABB".replaceAll("AA","\\$dd")
//更通用形式:
val tmp="$dd"
"AABB".replaceAll("AA",tmp.replaceAllLiterally("$","\\$"))