Java中的正则表达式名称不起作用

时间:2012-08-15 06:48:22

标签: java regex

我需要帮助在Java中使用以下名称编写正则表达式:

name
name`s
name name
name-name
name`s name
name`s-name

我尝试编写以下正则表达式,但它不起作用:(

String  nameRegex = "[A-Za-z]+(-|,|\\s)?[A-Za-z]*";

我写了以下功能

 public static boolean validateName(String val) {
    logger.info("in validate number");
    String  numberRegex = "^[A-Za-z]+(-\\s)?[A-Za-z]+$";

    if (val.matches(numberRegex)) {
        logger.info("in validate name of method validate");
        return true;
    } else {
        logger.info("in else  of method validate");
        return false;
    }
}

其验证是:

  1. name false 它应该是真的
  2. 123 true 它应该是假的
  3. abc022 true 它应该是假的
  4. abc dsf true
  5. abc-dsf true
  6. abc'-dsf true 它应该是假的
  7. 我的模式不满意。

    如果我使用此模式"^\p{L}+(?:[-,\s`]\p{L}+)*$"结束名称没有空格,则返回false。它也接受带有数字的名称。 abc123

1 个答案:

答案 0 :(得分:0)

  1. 您在备选列表中缺少“。”。

  2. 如果您的交替中只有一个字符,请使用字符类。

  3. 您应该将完整的最后一部分匹配0次或更多次。

  4. [a-zA-Z]是匹配名称的非常​​糟糕的选择。那些名字中有非ASCII字符的穷人是什么? 使用\p{L}代替

  5. 所以你的正则表达式看起来像

    ^\\p{L}+(?:[-,\\s`]\\p{L}+)*$
    

    \p{L} Unicode code property是否与具有“letter”==>属性的单个Unicode代码点匹配它匹配来自任何语言的任何类型的字母

    我在我的解决方案中也使用了锚点^$,如果你需要或不需要,它在Java中依赖于你使用的方法。请显示代码,如何调用正则表达式。