有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java正则表达式只允许1个破折号

我有一个文本框,可以从中获取用户的姓氏。如何在正则表达式中只允许一个破折号(-)?它不应该在字符串的开头或结尾
我有以下代码:

Pattern p = Pattern.compile("[^a-z-']", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(name);

共 (5) 个答案

  1. # 1 楼答案

    尝试类似于[a-z]-[a-z]的模式

    Pattern p = Pattern.compile("[a-z]-[a-z]");

  2. # 2 楼答案

    此正则表达式表示一个或多个非连字符,后跟一个连字符,后跟一个或多个非连字符

    ^[^\-]+\-[^\-]+$
    
    我不确定中间的连字符是否需要用反斜杠来逃脱……这可能取决于您用于正则表达式的平台

  3. # 3 楼答案

    试着用更通俗的术语来重新表述这个问题。与其说“只允许一个破折号,而且不能在开头”,不如说“字符串的开头,后跟至少一个非破折号,后跟一个破折号,后跟至少一个非破折号,后跟字符串的结尾。”

    • 字符串的开头:`^
    • 至少一个非破折号:[^-]+
    • 后跟一个破折号:-
    • 后跟至少一个非破折号:[^-]+
    • 后跟字符串的结尾:$

    把这些都放在一起,就这样了。如果您在与完整字符串(而不仅仅是其中的任何子字符串)匹配的上下文中使用此函数,则不需要锚点——尽管将锚点放在其中可能会很好,以防以后在与子字符串匹配的上下文中使用该正则表达式而忘记将其添加回

  4. # 4 楼答案

    为什么不在String中使用indexOf()

    String s = "last-name";
    int first = s.indexOf('-');
    int last = s.lastIndexOf('-');
    
    if(first == 0 || last == s.length()-1) // Checks if a dash is at the beginning or end
        System.out.println("BAD");
    if(first != last) // Checks if there is more than one dash
        System.out.println("BAD");
    

    它比使用正则表达式要慢,但通常姓氏的大小很小,所以一点也不值得注意。而且,它将使调试和将来的维护更加容易

  5. # 5 楼答案

    看起来您的正则表达式表示一个无效值的片段,您可能正在使用Matcher.find()来查找值的任何部分是否与该正则表达式匹配。对吗?如果是,您可以将模式更改为:

    Pattern p = Pattern.compile("[^a-zA-Z'-]|-.*-|^-|-$");
    

    它将匹配非字母非连字符非撇号字符、以连字符开头和结尾的字符序列(从而检测包含两个连字符的值)、前导连字符、尾随连字符