2016-09-25 82 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"將匹配兩次。你可以調整代碼來接受一組輸入字符串。