[英]Java check String and match
我正在尝试进行数学运算并匹配字符串中的一个字母:
我得到了这张桌子:
static final char[] LETTERS = {'T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X','B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E'};
我从 012345678X(8 位数字 + 1 个字符)中的 ID 键盘获取输入
我试图让它检查 8digits+1char 并像这样完成它:
public void check() {
if(input.matches("[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKE]{1}")){
status = true;}
我的问题是,现在我需要通过计算输入 % 23 的数字来检查最后输入的字母是否与表格匹配。有效输入示例:
现在我所做的尝试是这样的:
int num = Integer.parseInt(input.replaceAll("[^0-9]", ""));
if(input.matches("[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKE]{1}"))
{
switch(num){
case 0: if(num%23==0){
if(input.charAt(8)==LETTERS[0]){
status = true;
break;
}}
....
case 10: if(num%23==10){
if(input.indexOf(8)==LETTERS[10]){
status = true;
}}
default: status = false;
}
但是没有结果,知道我哪里出错了吗? 并不是我遇到了编译或代码错误,只是我得到的每一个 8digit+1letter 输入都被接受了。 先感谢您!
编辑(粘贴代码)
import java.util.Scanner;
public class Testing {
static final char[] LETRAS = {'T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X'
,'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C'
, 'K', 'E'};
String input;
public boolean status = false;
Scanner scanner = new Scanner(System.in);
//Método problema general
public static void main (String[] args) {
Testing programa = new Testing();
programa.inicio();
}
public void inicio() {
Intro();
while (!status){
datosUsuario();
comprobacion();
resultado();
}
}
//Explicar programa
public void Intro() {
System.out.println("¡Hola!\nEste programa pide y comprueba DNI's."
+ "A continuación va a pedir un DNI de forma 8 dígitos y una letra,"
+ "y va a comprobar si es válido.\n"
+ "Ejemplo DNI válido: 24659213Q\n\n");
}
//Métodos primer nivel de decomposición
//Pedir DNI por teclado
public void datosUsuario() {
System.out.print("Escribe DNI: ");
input = scanner.nextLine();
}
//Comprobación DNI
public boolean comprobacion() {
System.out.println("Comprobamos DNI...");
char letra = input.charAt(8);
if(input.matches("[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKEtrwagmyfpdxbnjzsqvhlcke]{1}"))
{
int numeros = Integer.parseInt(input.replaceAll("[^0-9]", ""));
if(LETRAS[numeros%LETRAS.length] == input.charAt(8)) {
return true;
}
}
return false;
}
//Mostrar resultado
public void resultado() {
if(status&&comprobacion()){
System.out.println("DNI válido!");
}
}
}
我在您的代码中看到很多问题,首先我不确定为什么要切换? 你可以简单地这样做
public static boolean isValid(String str) {
if(str.matches("[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKE]{1}")) {
int num = Integer.parseInt(str.replaceAll("[^0-9]", ""));
if(LETTERS[num%LETTERS.length] == str.charAt(8) ) {
return true;
}
}
return false;
}
String
。 如果模式与String
input.replaceAll("[^0-9]", "")
不匹配,则可能返回空String
; 在这种情况下, Integer.parseInt
会抛出异常。String
哪一部分包含数字。 在这种情况下,使用substring
比使用replaceAll
更有效。switch
。static final char[] LETTERS = {'T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X','B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E'};
public static boolean checkInput(String input) {
return input.matches("[0-9]{8}.")
&& LETTERS[Integer.parseInt(input.substring(0, 8)) % LETTERS.length] == input.charAt(8);
}
尝试这个:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTester2 {
static final char[] LETTERS = {'T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X','B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E'};
public static boolean isMatch(String input) {
Pattern p = Pattern.compile("^([0-9]{8})([TRWAGMYFPDXBNJZSQVHLCKE])$");
Matcher m = p.matcher(input);
if (m.matches()) {
String strNum = m.group(1);
String lastChar = m.group(2);
int num = Integer.parseInt(strNum);
int idx = num % 23;
return LETTERS[idx] == lastChar.charAt(0);
}
return false;
}
public static void main(String[] args) {
String[] inputs = {
"00000102X",
"24659213Q",
"12345679Z"
};
for (String s : inputs) {
System.out.println("match? " + s + " " + isMatch(s));
}
}
}
您的值“ num ”中的问题。 您检查是否 ( num % 23 == 10 ) 但您的 num 是多少? 您需要“ num ”的值,您需要从用户那里获取,或者您可以自己提供此值。 你需要这个,我想祝你好运。
做这个:
final Pattern pat = Pattern.compile("[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKE]{1}");
final Matcher finder = pat.matcher(input);
final ArrayList<String> matchList = new ArrayList<String>();
while(finder.find()){
char vchar;
MatchResult mr = finder.toMatchResult();
try {
int vnum = Integer.parseInt(input.substring(mr.start(), mr.end() - 1));
vchar = LETTERS[vnum % 23];
} catch(Exception e){
continue;
}
if(vchar == input.charAt(mr.end() - 1)){
matchList.add(input.substring(mr.start(), mr.end()));
}
}
输入是一个字符串: "00000102X00000102X"
会匹配两次。 您可以调整代码以接受输入字符串数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.