繁体   English   中英

Java 检查字符串并匹配

[英]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 的数字来检查最后输入的字母是否与表格匹配。有效输入示例:

  • 00000102X 因为 102 % 23 = 10 并且 X 是我的字符列表中的第 10 个字母;
  • 24659213Q 从 24659213 % 23 = 16 开始,Q 是字符列表中的第 16 个字母。

现在我所做的尝试是这样的:

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;
}
  1. 在匹配正则表达式之前,您不应该解析String 如果模式与String input.replaceAll("[^0-9]", "")不匹配,则可能返回空String 在这种情况下, Integer.parseInt会抛出异常。
  2. 如果正则表达式匹配,您就知道String哪一部分包含数字。 在这种情况下,使用substring比使用replaceAll更有效。
  3. 只需将您从输入中获得的字符与数组中的字符进行比较。 不要使用switch
  4. 如果将最后一个字母与数组中的元素进行比较,则不需要如此复杂的字符组。 只允许任何字符作为最后一个字符,其余字符与数组元素进行比较。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM