【问题标题】:Validate a string contains only certain characters in java验证字符串仅包含java中的某些字符
【发布时间】:2013-11-18 01:08:19
【问题描述】:

好的,我正在尝试做的是以中缀表示法获取用户输入并将其转换为后缀,然后对其进行评估。我已经完成了。

我正在苦苦挣扎的是,对于用户输入,我需要验证它是否只包含以下内容:()、0-9、+、-、*、/、%

每个字符都用空格分隔,所以这里是一个潜在的有效输入:

( 3 + 4 ) * 5 / ( 6 - 7 )

我创建了一个 InvalidCharacterException,如果用户字符串包含这些字符以外的任何内容,我希望抛出该异常。

下面是无效输入的样子:

3 - 5 ^ 5

^ 将是一个无效字符,然后我会抛出新的 InvalidCharacterException 并要求新的输入。

我还要说我看过大量的正则表达式样本,老实说我不明白他们在做什么。

编辑:

好的,这就是我最终实现的,因为我真的不了解其他任何内容。有什么更简单的建议吗?

    for(int i = 0; i <= infix.length(); i++){
        if(infix.charAt(i) ==  '(' || infix.charAt(i) == ')' || infix.charAt(i) =='+' 
                || infix.charAt(i) =='-' ||infix.charAt(i) == '*' ||infix.charAt(i) == '/'
                ||infix.charAt(i) == '%' ||infix.charAt(i) ==' ' ||infix.charAt(i) == '0' 
                ||infix.charAt(i) == '1' || infix.charAt(i) =='2' || infix.charAt(i) =='3' 
                ||infix.charAt(i) == '4' ||infix.charAt(i) == '5' ||infix.charAt(i) == '6' 
                ||infix.charAt(i) == '7' || infix.charAt(i) =='8' ||infix.charAt(i) == '9'){

        }else{
            throw new InvalidCharacterException(infix.charAt(i));
        }

    }

Infix 是我作为 StringBuffer 的用户输入的变量名。

【问题讨论】:

  • 在我的回答中检查push方法中的条件语句。它可以代替你的超长条件语句。

标签: java validation


【解决方案1】:

您可以使用 Scanner 来验证您的字符串:

    Scanner scanner = new Scanner(string);        
    String validationResult = scanner.findInLine("[^0-9()+\\-*\\/%]+");
    if (validationResult != null) {
        // Invalid character found.
        throw new InvalidCharacterException("Invalid character: " + validationResult);
    }

findInLine 方法返回一个字符串,其中包含与正则表达式匹配的字符,并且正则表达式会查找在您的验证中无效的任何字符。 findInLine 仅在 String 中有任何无效字符时才返回非 null String。

【讨论】:

  • 我需要说明什么才能使空白也成为有效字符?
  • 只需在正则表达式中添加空格或任何其他有效字符。要添加空格,您可以使用:"[^0-9()+\\-*\\/% ]+"(注意在 '%' 和 ']' 之间添加的空格)
  • 这是我从一开始就希望做的事情,我的 for 循环方法是一种解决方法的可怜尝试。我已经查看了此代码,但无法理解如何实现它。谢谢。
【解决方案2】:

我建议您使用Scanner(对于example)然后遍历每个字符(在每个标记中)并在满足您的条件时抛出异常(例如查看Character.isDigit)或直接写您自己的方法来测试可接受的字符(例如,char 是否包含在“()0123456789+-*/%”中)。

【讨论】:

  • 这正是我想做的,但我不知道该怎么做,这就是我来这里的原因。我正在尝试编写一些东西来查看包含这些值的另一个字符串,或者尝试编写一个正则表达式来为我做这件事,但我不知道如何为我想要的东西创建正则表达式。我也从未使用过扫描仪来解析这样的字符串,我一直在尝试阅读有关它的教程,但我得到的信息比预期的要少得多。
【解决方案3】:

在您的代码中,这可能会更好,因为它做同样的事情。 顺便说一句,它可能应该是 i

 for(int i = 0; i < infix.length(); i++){
        char x = infix.charAt(i);
        if(!(Character.isDigit(x) || x == '/' || x == '*' ||
           x == '+'|| x== '-' || x=='%' || x == '\n'))
            throw new InvalidCharacterException(x);


        /* what you want to do if valid*/

 }

【讨论】:

  • 如果它有效,它会继续执行我编写的其余代码,将其从中缀转换为后缀。我正在使用堆栈来执行此操作,但作为我正在执行的操作的一部分,我正在转换的方法应该抛出异常
  • @Neonjoe woops 删除了不相关的堆栈,现在检查我的答案。希望那是您正在寻找的条件语句。而且我认为您的循环中存在一些逻辑错误。
  • 我尝试使用类似你所写的东西,但不是 isLetterOrDigit 我只是使用 !Character.isDigit(x) 但每次我尝试使用简单的 1 + 实际运行代码2 它抛出一个 InvalidCharacterException for 1
  • @Neonjoe 也许是因为布尔逻辑?申请时应使用括号!让没有突然的||变得 &&。不过试试看:)
  • @Neonjoe 顺便说一句,您还应该检查它是否是 '\n' 字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2014-05-07
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
相关资源
最近更新 更多