Java中的正则表达式
我尝试将此答案中的代码移植到Java: 我知道Java中的String.matches有点喜怒无常,我对正则表达式非常不熟悉。代码如下:Java中的正则表达式,java,regex,string,validation,Java,Regex,String,Validation,我尝试将此答案中的代码移植到Java: 我知道Java中的String.matches有点喜怒无常,我对正则表达式非常不熟悉。代码如下: public boolean validateVIN(String vin) { vin = vin.toLowerCase(); if(!vin.matches("/^[^\\Wioq]{17}$/")) { //the offending code, always fails Log.e("vininfo", "did
public boolean validateVIN(String vin) {
vin = vin.toLowerCase();
if(!vin.matches("/^[^\\Wioq]{17}$/")) { //the offending code, always fails
Log.e("vininfo", "did not pass regex");
return false;
}
int[] weights = { 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 };
//array positions coorespond to the 26 letters of the alphabet
int[] transliterations = { 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 0, 7, 0, 9, 2, 3, 4, 5, 6, 7, 8, 9 };
int sum = 0;
String checkdigit = ".";
for(int i=0; i < vin.length(); i++) {
//add transliterations * weight of their positions to get the sum
int temp = 0;
temp = vin.charAt(i);
if(temp < 58) {
sum += (temp-48)*weights[i];
Log.e("vinsum.num", String.valueOf(sum));
} else {
sum += transliterations[temp-97]*weights[i];
Log.e("vinsum.chr", String.valueOf(sum));
}
}
if(checkdigit.equals("10")) {
checkdigit = "x";
} else {
//find checkdidgit by taking the mod of the sum
checkdigit = String.valueOf(sum % 11);
}
Log.i("vininfo", "checkdigit: "+checkdigit+" ... VIN[8]: "+vin.substring(8,9));
return (checkdigit.equals(vin.substring(8, 9)));
}
public boolean validateVIN(字符串vin){
vin=vin.toLowerCase();
如果(!vin.matches(“/^[^\\Wioq]{17}$/”){//出现问题的代码总是失败
Log.e(“vininfo”,“未通过正则表达式”);
返回false;
}
int[]权重={8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2};
//数组位置与字母表中的26个字母对应
int[]音译={1,2,3,4,5,6,7,8,0,1,2,3,4,5,0,7,0,9,2,3,4,5,6,7,8,9};
整数和=0;
字符串checkdigit=“.”;
对于(int i=0;i
熟悉在Java中使用此正则表达式的正确方法的人?请删除正则表达式中的斜杠。换言之:
if(!vin.matches("^[^\\Wioq]{17}$")) {
在家里试试这个:
class Vin {
public static void main( String ... args ) {
String vin = "1M8GDM9A_KP042788";
if(!vin.matches("[^\\Wioq]{17}")) { //the offending code, always fails
System.out.println("vininfo did not pass regex");
} else {
System.out.println("works");
}
}
}
印刷品:
$java Vin
works
您不需要
/^
和$/
如果删除斜杠无效,请在退出之前打印vin。看起来vin应该都是小写的。如果所有其他操作都失败,请使用调试器。@moonlightcheese-仅供参考如果您不将vin转换为小写(如链接中的代码),任何I、O或Q都将在负字符类中匹配。