【问题标题】:How do return false if the String contains a space between letters?如果字符串在字母之间包含空格,如何返回 false?
【发布时间】:2016-02-02 01:27:25
【问题描述】:

子字符只能是字母、数字、美元符号或下划线的成员。

给定一个字符串,判断它是否是一个有效的标识符。我已经完成了大部分。

public class IdentifierChecker {
    public static boolean isValid(String idn) {
        // here's your code...
        boolean valid = false;

        if (idn.length() > 0) {
            char firstChar = idn.charAt(0);

            if (Character.isLetter(firstChar) || firstChar == '_'
                    || firstChar == '$') {

                for (int i = 1; i < idn.length(); i++) {
                    if (Character.isLetter(idn.charAt(i))
                            || Character.isDigit(idn.charAt(i))
                            || firstChar == '_' || firstChar == '$') {
                        valid = true;
                    } else {
                        valid = false;
                    }
                }
            }
        }
        return valid;
    }
}

以下是有效标识符的语法:

每个标识符必须至少有一个字符。

第一个字符必须选自:字母、下划线或美元符号。第一个字符不能是数字。

其余字符(第一个除外)可以来自:字母、数字、下划线或美元符号。换句话说,它可以是任何有效的标识符字符。

有效标识符示例:

i
wo_rd
b2h

无效标识符示例:

1i
wo rd
!b2h

【问题讨论】:

  • valid=false时断开循环。

标签: java


【解决方案1】:

声明:

               if (Character.isLetter(idn.charAt(i))
                        || Character.isDigit(idn.charAt(i))
                        || firstChar == '_' || firstChar == '$')

应该是:

               if (Character.isLetter(idn.charAt(i))
                        || Character.isDigit(idn.charAt(i))
                        || idn.charAt(i) == '_' || idn.charAt(i) == '$')

因为您会拒绝带有“_”或“$”的标识符,而不是在开头。此外,一旦valid 设置为false,您应该停止循环,否则valid 将基于标识符中的最后一个字符。

【讨论】:

    【解决方案2】:

    在你的 else 块中,由于任何无效条件都会使整个字符串无效,因此添加

    break;
    

    之后

    valid = false;
    

    在你的 else 块中。

    这将设置返回值,并停止 for 循环的进一步循环。

    【讨论】:

    • Nitpick:我总是被教导在方法/函数中有一个入口和一个出口点,因为它提高了可读性并降低了丢失隐藏在代码深处的 return 语句的风险
    • 同意,我也被教过。会破裂;那么这里最合适呢?
    • 就个人而言,这将是我的选择之一
    【解决方案3】:

    试试下面的代码:

    public class IdentifierChecker {
    
        public static void main(String[] args) {
            System.out.println(isValid("i"));
            System.out.println(isValid("wo_rd"));
            System.out.println(isValid("b2h"));
            System.out.println(isValid("1i"));
            System.out.println(isValid("wo rd"));
            System.out.println(isValid("!b2h"));
            System.out.println(isValid(""));
    
        }
    
        public static boolean isValid(String idn) {
            // here's your code...
            boolean valid = false;
    
            if (idn.length() > 0) {
                char firstChar = idn.charAt(0);
                if (Character.isLetter(firstChar) || firstChar == '_' || firstChar == '$') {
                    for (int i = 0; i < idn.length(); i++) {
                        if (Character.isLetter(idn.charAt(i)) || Character.isDigit(idn.charAt(i)) || idn.charAt(i) == '_' || idn.charAt(i) == '$') {
                            valid = true;
                        } else {
                            valid = false;
                            break;
                        }
                    }
                }
            }
            return valid;
        }
    }
    

    【讨论】:

      【解决方案4】:

      使用正则表达式,您可以简单地做到:

      static final Pattern PATTERN = Pattern.compile("[a-zA-Z_$][\\w_$]*");
      
      static boolean isValid(String idn) {
        return PATTERN.matcher(idn).matches();
      }
      

      [a-zA-Z_$] 恰好匹配a-zA-Z 以及_$ 范围内的一个字符。

      [\\w_$] 匹配a-zA-Z0-9_$ 范围内的零个或多个字符。

      测试:

      public static void main(String[] args) {
        // valid identifiers:
        System.out.println(isValid("i")); // true
        System.out.println(isValid("wo_rd")); // true
        System.out.println(isValid("b2h")); // true
        // invalid identifiers:
        System.out.println(isValid("1i")); // false
        System.out.println(isValid("wo rd")); // false
        System.out.println(isValid("!b2h")); // false
        System.out.println(isValid("")); // false
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-20
        • 2013-03-01
        • 1970-01-01
        相关资源
        最近更新 更多