-5

我需要帮助在 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. 名称假 它应该是真的
  2. 123 真的 应该是假的
  3. abc022 true 它应该是 false
  4. abc dsf 真
  5. abc-dsf 真
  6. abc'-dsf true 它应该是 false

我给定的模式不满意。

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

4

1 回答 1

0
  1. 您的替代列表中缺少“`”。

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

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

  4. [a-zA-Z]匹配名称是一个非常糟糕的选择。那些名字中包含非 ASCII 字符的穷人是怎么回事?改用\p{L}. _

所以你的正则表达式可能看起来像

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

\p{L}是一个Unicode 代码属性,它匹配具有属性 "letter" ==> 的单个 Unicode 代码点,它匹配来自任何语言的任何类型的字母

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

于 2012-08-15T07:30:56.267 回答