簡體   English   中英

Java:如何檢查字符串是否僅包含數字和連字符

[英]Java: How to check if a string contains only numbers and hyphens

我只是有一個程序必須讀取 ssn (xxx-xx-xxxx) 並確定給定的 ssn 是否有效。 我只需要一種方法來檢查字符串是否只包含# 和-。

import java.util.Scanner;
public class Prog7 {
  public static void main(String[] args) {

  Scanner input = new Scanner(System.in);
  System.out.print("Enter a SSN:");
  String ssn = input.next();

  if((ssn.substring(0, 4).indexOf('-') != 3) || (ssn.substring(4, 7).indexOf('-') != 2) || 
     (ssn.substring(ssn.length() - 5, ssn.length()).indexOf('-') != 0) ) {
     System.out.println(ssn + " is an invalid social security number");
  }
  else {
    System.out.println(ssn + " is a valid social security number");
  }

  }
}

表示xxx-xx-xxxx正則表達式,其中x代表數字,可以寫為\d\d\d-\d\d-\d\d\d\d (注意:字符串文字中的\是特殊字符,所以如果您想將其用作符號並傳遞給正則表達式引擎,您需要用另一個\對其進行轉義,因此表示\d的字符串文字需要寫為"\\d" )。

現在您可以簡單地使用yourString.matches(regex)來查看正則表達式是否匹配整個yourString

很簡單

String ssn = input.next();

if(ssn.matches("\\d\\d\\d-\\d\\d-\\d\\d\\d\\d")){
    //here we know that `snn` is valid
}

應該可以正常工作。

改進:

您可以使用quantifiers使您的正則表達式更具可讀性。 例如,使用{n}我們可以表示前一個元素必須出現多少次。 所以我們可以寫\d{3}而不是\d\d\d

Scanner也有支持正則表達式的方法,比如hasNext(regex)來檢查下一個標記是否可以被正則表達式匹配。 如果不是,我們可以簡單地使用next()使用它並請求新值:

System.out.print("Enter a SSN:");
while(!input.hasNext("\\d{3}-\\d{2}-\\d{4}")){
    String invalid = input.next();
    System.out.print(invalid + " is not valid SSN. Please try again:");
}
//here we are sure that data provided by user represent valid SSN
String ssn = input.next();

使用正則表達式:

String ssn = input.next();
String pattern = "[0-9]{3}-[0-9]{2}-[0-9]{4}";
Pattern p = Pattern.compile(pattern);

Matcher m = p.matcher(ssn);
if (m.find( )) {
    System.out.println(ssn + " is an invalid social security number");
}else{
    System.out.println(ssn + " is a valid social security number");
}

如果你和我一樣討厭正則表達式,你也可以通過比較字符來迭代 ASCII 值。

public class HelloWorld{

 public static void main(String []args){
    System.out.println("Test A: " + checkSSN("123-45-6789"));
    System.out.println("Test B: " + checkSSN("12a-45-6789"));
    System.out.println("Test C: " + checkSSN("123-4"));
    System.out.println("Test D: " + checkSSN("123-45-20303"));
 }

 public static boolean checkSSN(String ssn) {
     int count = 0;
     for (char c : ssn.toCharArray()) {
         if (count == 3 || count == 6) {
             if (c != '-') {
                 System.out.println("Character" + c + "Not a dash, returning false");
                 return false;
             } 
         } else if (c < '0' || c > '9') {
             System.out.println("NaN, return false");
             return false;
         }
         count++;
     }
     if (count != 11) {
         System.out.println("Doesn't meet length criteria");
         return false;
     }
     return true;
 }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM