2016-09-25 96 views
-4

我试图做一个数学运算和匹配串的字母:Java的检查字符串和匹配

我得到这个表:

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'}; 

table

而且我越来越投入从X(8位+ 1个字符)的ID的键盘上输入

我试图让它检查8位数+ 1char,并且像这样完成:

我的问题是,现在我需要检查最后输入的字母通过计算输入%的数字23 的有效输入实施例的表匹配:

  • 00000102X因为102%23 = 10和X是我char列表中的第10个字母;
  • 24659213Q自24659213%23 = 16且Q是char列表中的第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; 
    } 

,但没有结果,任何想法,我要去哪里错了?这并不是说我收到编译或代码错误,只是我得到的每个8位数字+字母输入都被接受。先谢谢你!

EDIT(粘贴CODE)

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!"); 
    } 
} 
} 
+1

不知道你在做什么。发布一个[MCVE] – c0der

回答

1

我看到你的代码中的许多问题,首先我不知道为什么是开关? 你可以简单地做这样的

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; 
} 
+0

对不起,我不得不从西班牙语翻译,以使其不可思议,有点,似乎我失败了。但你说得对,你提供的代码似乎有效,但我无法让程序显示OK或NOT OK的回复。我可以在这里粘贴所有的代码吗?即使它是西班牙语? –

+0

我通过添加完整的代码更新了我的问题。 –

+1

你可以简单地调用我写的“isValid”的方法,并检查它是否返回true,然后打印好,如果它返回false打印不好ok –

0

试试这个:

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)); 
     } 

    } 
} 
+0

这工作得很好,但我从用户键盘输入。用整个代码更新我的问题。对不起,如果西班牙语让人难以理解。 –

0

你的问题,关于你的价值 “数”。你检查是否(num%23 == 10),但是你的num是什么?您需要获得来自用户的“num”值,或者您可以自己给出该值。你需要这个我觉得好运。

+0

嗨。 num是从String中提取的int。我从用户的扫描仪获得输入。通过添加所有代码更新了帖子。希望现在更有意义。 –

1
  1. 在匹配正则表达式之前,您不应该解析String。如果模式不匹配Stringinput.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); 
} 
+0

该代码工作得很好!谢谢! –

0

这样做:

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"将匹配两次。你可以调整代码来接受一组输入字符串。