1.「安卓按键精灵」几种字符串提取的方法(源码)
2.你知道ApacheCommon包中isNumeric方法是坑吗?
「安卓按键精灵」几种字符串提取的方法(源码)
截取法提取两个字符串之间的内容
TracePrint GetStrAB("如果想要写成一行代码,那么就可以用冒号连接","想要","代码")
Function GetStrAB(str,StrA,StrB)
If UTF8.InStr(1, str, StrA)>0 and utf8.instr(1,str,StrB) > 0 Then
Dim m=utf8.instr(1,Str,StrA)
Dim n=utf8.instr(m,Str,StrB)
GetStrAB=utf8.mid(str,m+utf8.len(StrA),n-m-utf8.len(StrA))
End If
End Function
分割法提取字符串
TracePrint SplitStrAB("如果想要写成一行代码,那么就可以用冒号连接","想要","代码")
Function SplitStrAB(str, StrA, StrB)
If UTF8.InStr(1, str, StrA) > 0 and UTF8.InStr(1, str, StrB) > 0 Then
Dim arr_A=split(str,StrA)
Dim arr_B=split(arr_A(1),StrB)
SplitStrAB=arr_B(0)
end if
End Function
取多组两个字符串之间的内容
Dim arr=GetStrArr("如果(公众号3分钟学堂)写成一行(代码),那么就(可以)用冒号连接",android改系统源码"(",")")
For Each k In arr
TracePrint k
Next
Function GetStrArr(str, StrA, StrB)
If UTF8.InStr(1, str, StrA) > 0 and UTF8.InStr(1, str, StrB) > 0 Then
Dim str_arr=array()
Dim n=0
Dim arr_A=split(str,StrA)
Dim arr_B
For i = 1 To UBOUND(arr_A)
If InStr(1,arr_A(i),StrB) > 0 Then
arr_B = Split(arr_A(i), StrB)
str_arr(n) = arr_B(0)
n=n+1
End If
Next
GetStrArr=str_arr
end if
End Function
提取数字
TracePrint GetNum("如果_ba@d1b都是a2aaf%b连接")
Function GetNum(str)
Dim Num
For i = 1 To UTF8.Len(str)
If IsNumeric(utf8.StrGetAt(str,i)) Then
Num=Num&utf8.StrGetAt(str,i)
End If
Next
GetNum=Num
End Function
提取字母
TracePrint GetZm("如果_ba@d1b都是a2aaf%b连接")
Function GetZm(str)
Dim zm
For i = 1 To UTF8.Len(str)
If < CInt(Asc(utf8.StrGetAt(str, i))) < or < CInt(Asc(utf8.StrGetAt(str, i))) < Then
zm=zm&utf8.StrGetAt(str,i)
End If
Next
GetZm=zm
End Function
提取汉字
TracePrint GetCN("如果_ba@d1b都是a2aaf%b连接")
Function GetCN(str)
Dim CN
For i = 1 To UTF8.Len(str)
If Len(utf8.StrGetAt(str, i)) = 3 Then
CN=CN&utf8.StrGetAt(str, i)
End If
Next
GetCN=CN
End Function
正则提取数字
import"shanhai.lua"
Dim str="如果_ba@d1b都是a2aaf%b连接"
dim arr= shanhai.RegexFind(str,"%d+")
TracePrint join(arr,"")
正则提取字母
import"shanhai.lua"
Dim str="如果_ba@d1D都是a2aaf%b连接"
dim arr= shanhai.RegexFind(str,"%a+")
TracePrint join(arr,"")
正则提取汉字
import"shanhai.lua"
Dim str="如果_ba@d1D都是a2aaf%b连接"
dim arr= shanhai.RegexFind(str,"[\-\]+")
TracePrint join(arr,"")
本期文章是源码分享的形式,感兴趣的朋友可以复制源码在按键中运行一下,自己照着去写写就可以学会。供求发布 源码
你知道ApacheCommon包中isNumeric方法是坑吗?
使用的Apache-Common包的版本是commons-lang-2.6.jar
本文就来分享一个这个坑的情况,以免其它tx也掉坑中
费话不多说,来看代码: package chapter4; import org.apache.commons.lang.StringUtils; /** * Created by MyWorld on /3/. */ public class StringUtilsIsNumericChecker { public static void main(String[] args) { System.out.println(StringUtils.isNumeric("1")); System.out.println(StringUtils.isNumeric("-1")); } }
围观的tx,认为上面api的输出结果会是什么呢?两个true? 好吧,执行一行看看结果: true false
什么情况,-1不是数字吗? 为什么是false呢 来分析下源码: public static boolean isNumeric(String str) { if (str == null) { return false; } int sz = str.length(); for (int i = 0; i sz; i++) { if (Character.isDigit(str.charAt(i)) == false) { return false; } } return true; }
源码中判断是否数字的依据是JDK的API: java.lang.Character.isDigit(str.charAt(i)) 看看个API的源码: public static boolean isDigit(char ch) { return isDigit((int)ch); }
看看isDigit(int codePoint)的源码: public static boolean isDigit(int codePoint) { boolean bDigit = false; if (codePoint = MIN_CODE_POINT codePoint = FAST_PATH_MAX) { bDigit = CharacterDataLatin1.isDigit(codePoint); } else { int plane = getPlane(codePoint); switch(plane) { case(0): bDigit = CharacterData.isDigit(codePoint); break; case(1): bDigit = CharacterData.isDigit(codePoint); break; case(2): bDigit = CharacterData.isDigit(codePoint); break; case(3): // Undefined case(4): // Undefined case(5): // Undefined case(6): // Undefined case(7): // Undefined case(8): // Undefined case(9): // Undefined case(): // Undefined case(): // Undefined case(): // Undefined case(): // Undefined bDigit = CharacterDataUndefined.isDigit(codePoint); break; case(): bDigit = CharacterData0E.isDigit(codePoint); break; case(): // Private Use case(): // Private Use bDigit = CharacterDataPrivateUse.isDigit(codePoint); break; default: // the argument's plane is invalid, and thus is an invalid codepoint // bDigit remains false; break; } } return bDigit; }
下面还有更深的调用,貌似还涉及到ASCII码了。金元帅 源码 水太深,就不继续看了。 有一点是nginx 1.12.1源码肯定的,这个API不是通过类似Regex expression的方式来判断是数字,而通过每个字符的ASCII的值类确定的 回到API的isNumeric(String str), 看看Doc是手术麻醉 源码怎么说的: /** * pChecks if the String contains only unicode digits. * A decimal point is not a unicode digit and returns false./p * * pcodenull/code will return codefalse/code. * An empty String (length()=0) will return codetrue/code./p * * pre * StringUtils.isNumeric(null) = false * StringUtils.isNumeric("") = true * StringUtils.isNumeric(" ") = false * StringUtils.isNumeric("") = true * StringUtils.isNumeric(" 3") = false * StringUtils.isNumeric("ab2c") = false * StringUtils.isNumeric("-3") = false * StringUtils.isNumeric(".3") = false * /pre * * @param str the String to check, may be null * @return codetrue/code if only contains digits, and is non-null */
看完上面的Doc,感觉水好深。 这个API的方法名直接命名为isInt不就完了。方法名很容易误导人 这也是给开发的tx敲了一个警钟, api使用之前一定要确认清楚,至少看看Doc文档吧