【问题标题】:Validate is a string is empty using Scanner and return the empty string as valid value使用 Scanner 验证字符串是否为空,并将空字符串作为有效值返回
【发布时间】:2020-11-22 15:21:30
【问题描述】:

我使用 Java 中的 Scanner 来获取用户条目,例如姓名、姓氏、电子邮件和电话。姓名和姓氏是必需的,但电子邮件和电话不是必需的,用户只需按 Enter 键即可将其留空。

这是我用来验证每个条目的长度并在长度低于或超过 lngMin 或 lngMax 时显示错误消息的方法。

public static String validateString (String msgSoll, String msgErr, 
               int lngMin, int lngMax) {
          String myString = null;
          
          if (lngMin >= 0 && lngMax >= lngMin) {
             do {
                System.out.print(msgSoll);
                myString = myScanner.nextLine();
                if (myString.length() < lngMin || myString.length() > lngMax) {
                   System.out.println(msgErr);
                }
             } while (myString.length() < lngMin || myString.length() > lngMax);
          }
          return myString;
       }

我有这个方法来验证电子邮件,我调用了 validateString 方法和其他方法来验证电子邮件是否包含至少 1 个点和只有一个 @ 以及特殊字符和数字字符。在这种方法中,我想验证电子邮件是否为空,如果它返回一个空电子邮件作为有效值。

public static String validateEmail() {
        String email = null;
        String validEmail = null;
        boolean isAlpha = false;

            do {

                email = validateString(MSG_SOLL_COURRIEL, MSG_ERR_COURRIEL, 5, 50);

                isAlpha = Tp2Utils.isAlphaNumPlus(email, "@,.,_") && Tp2Utils.hasNChar(email, '.') >= 1 && Tp2Utils.hasNChar(email, '@') == 1;


                    if (isAlpha) {
                        validEmail = email;
                    }


            } while (!isAlpha);

        return validEmail;
}

我有这种方法来验证电话,我使用一种方法来验证 tel 是否仅包含数字字符。在该方法中,我还需要验证 tel 是否为空,如果是,则将空 tel 作为有效值返回。

 public static String validateTel() {
    
            boolean telValid = false;
    
            String tel = null;
            String telVal;
    
            do {
    
                tel = validateString(MSG_SOLL_TEL, MSG_ERR_TEL, 10, 10);
    
                telValid = Tp2Utils.containsOnlyNums(tel);
    
    
            } while (!telValide);
    
            telVal = tel;
    
            return telVal;  
        }

如果有人能帮助我解决我的验证问题,我将不胜感激。

谢谢

【问题讨论】:

  • 返回被验证字符串的验证方法不好,它应该返回例如 true/false 来说明字符串是否有效。因此,将扫描仪的读取和实际验证分为 2 种方法

标签: java string validation


【解决方案1】:

更新(感谢Joakim Danielson):

boolean mandatory虽然增加了新参数,会让代码不那么混乱和干净,即使处理lngMin的值也可以解决问题

public static String validateString (String msgSoll, String msgErr, int lngMin, int lngMax) {
    String myString = null;

    if (lngMin >= 0 && lngMax >= lngMin) {
        do {
            System.out.print(msgSoll);
            myString = myScanner.nextLine();

            // Return a blank string if the min required length is 0
            if (lngMin == 0 && myString.isBlank()) {
                return myString;
            }

            if (myString.length() < lngMin || myString.length() > lngMax) {
                System.out.println(msgErr);
            }
        } while (myString.length() < lngMin || myString.length() > lngMax);
    }

    return myString;
}

那么,你称它为

public static String validateEmail() {
    String email = null;
    String validEmail = null;
    boolean isAlpha = false;

    do {
        email = validateString(MSG_SOLL_COURRIEL, MSG_ERR_COURRIEL, 0, 50);
        if (email.isBlank()) {
            return email;// Return blank
        }
        isAlpha = Tp2Utils.isAlphaNumPlus(email, "@,.,_") && Tp2Utils.hasNChar(email, '.') >= 1 && Tp2Utils.hasNChar(email, '@') == 1;
        if (isAlpha) {
            validEmail = email;
        }
    } while (!isAlpha);

    return validEmail;
}

原答案:

您可以在方法签名中放置一个布尔参数,例如 boolean mandatory。如果您为此参数传递false,则该方法应返回一个空字符串,以防用户在未输入任何值的情况下按Enter

public static String validateString (String msgSoll, String msgErr, int lngMin, int lngMax, boolean mandatory) {
    String myString = null;

    if (lngMin >= 0 && lngMax >= lngMin) {
        do {
            System.out.print(msgSoll);
            myString = myScanner.nextLine();

            // Return a blank string if not mandatory
            if (!mandatory && myString.isBlank()) {
                return myString;
            }

            if (myString.length() < lngMin || myString.length() > lngMax) {
                System.out.println(msgErr);
            }
        } while (myString.length() < lngMin || myString.length() > lngMax);
    }

    return myString;
}

那么,你称它为

public static String validateEmail() {
    String email = null;
    String validEmail = null;
    boolean isAlpha = false;

    do {
        email = validateString(MSG_SOLL_COURRIEL, MSG_ERR_COURRIEL, 5, 50, false);
        if (email.isBlank()) {
            return email;// Return blank
        }
        isAlpha = Tp2Utils.isAlphaNumPlus(email, "@,.,_") && Tp2Utils.hasNChar(email, '.') >= 1 && Tp2Utils.hasNChar(email, '@') == 1;
        if (isAlpha) {
            validEmail = email;
        }
    } while (!isAlpha);

    return validEmail;
}

【讨论】:

  • 添加一个新参数有什么意义,同样可以通过调用lngMin = 0的方法来实现?
  • @JoakimDanielson - 不是,lngMin = 0lngMax = 0 可以达到目的。但是,新参数boolean mandatory 将使代码不那么混乱和简洁。
  • 不,lngMax 设置为 0 意味着任何非空字符串都会失败
  • @JoakimDanielson - 你是对的。我已更新答案以纳入您的建议。
【解决方案2】:

完整的解决方案:

public class Main {


    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String name = getValidatedField(in, "Enter your name: ", Validators.NAME_VALIDATOR);
        String surname = getValidatedField(in, "Enter your surname: ", Validators.NAME_VALIDATOR);
        String email = getValidatedField(in, "Enter your email: ", Validators.EMAIL_VALIDATOR);
        String phone = getValidatedField(in, "Enter your phone: ", Validators.PHONE_VALIDATOR);

        // process your validated fields here
    }

    private static String getValidatedField(Scanner in, String message, Function<String, ValidationResult> validationRule) {
        ValidationResult validationResult;
        String input;
        do {
            System.out.println(message);
            input = in.nextLine();
            validationResult = validationRule.apply(input);
            System.out.println(validationResult.getMessage());
        } while (!validationResult.isSuccess());
        return input;
    }
}

class Validators {
    private static final String WRONG_LENGTH_MSG = "Invalid length.";
    private static final String WRONG_FORMAT_MSG = "Wrong format.";
    private static final String EMAIL_PATTERN = "(^$|^[A-Za-z0-9]+@[A-Za-z0-9]+\\.[A-Za-z]+$)";
    private static final String NAME_PATTERN = "^[A-Za-z ,.'-]*$";
    private static final String ONLY_NUMBERS_PATTERN = "^[0-9]*$";

    private static boolean checkMinMaxLength(final String input, int min, int max) {
        int length = input.length();
        return length < min || length > max;
    }

    public static Function<String, ValidationResult> NAME_VALIDATOR = input ->
    {
        final ValidationResult result;
        if (checkMinMaxLength(input, 1, 10)) {
            result = ValidationResult.failure().message(WRONG_LENGTH_MSG);
        } else if (!input.matches(NAME_PATTERN)) {
            result = ValidationResult.failure().message(WRONG_FORMAT_MSG);
        } else {
            result = ValidationResult.success();
        }
        return result;
    };

    public static Function<String, ValidationResult> PHONE_VALIDATOR = input ->
    {
        final ValidationResult result;
        if (!StringUtils.isBlank(input)) {
            if (checkMinMaxLength(input, 2, 11)) {
                result = ValidationResult.failure().message(WRONG_LENGTH_MSG);
            } else if (!input.matches(ONLY_NUMBERS_PATTERN)) {
                result = ValidationResult.failure().message(WRONG_FORMAT_MSG);
            } else {
                result = ValidationResult.success();
            }
        } else {
            result = ValidationResult.success();
        }
        return result;
    };

    public static Function<String, ValidationResult> EMAIL_VALIDATOR = input ->
    {
        final ValidationResult result;
        if (!StringUtils.isBlank(input)) {
            if (checkMinMaxLength(input, 4, 20)) {
                result = ValidationResult.failure().message(WRONG_LENGTH_MSG);
            } else if (!input.matches(EMAIL_PATTERN)) {
                result = ValidationResult.failure().message(WRONG_FORMAT_MSG);
            } else {
                result = ValidationResult.success();
            }
        } else {
            result = ValidationResult.success();
        }
        return result;
    };


    private Validators() {
    }
}

class ValidationResult {
    private static final String OK_MSG = "OK";
    private final boolean success;
    private String message;

    public ValidationResult(boolean success) {
        this.success = success;
    }

    public ValidationResult(boolean success, String message) {
        this.success = success;
        this.message = message;
    }

    public static ValidationResult success() {
        return new ValidationResult(Boolean.TRUE, OK_MSG);
    }

    public static ValidationResult failure() {
        return new ValidationResult(Boolean.FALSE);
    }

    public ValidationResult message(String message) {
        this.message = message;
        return this;
    }

    public boolean isSuccess() {
        return success;
    }

    public String getMessage() {
        return message;
    }
}

【讨论】:

  • 仅代码答案不是很有帮助,请添加您的解决方案的说明
猜你喜欢
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
相关资源
最近更新 更多