Java正则表达式来检查是否至少有一个字母

Java正则表达式来检查是否至少有一个字母,java,regex,Java,Regex,我在SO和web上都发现了很多关于这个主题的变化,但大多数(如果不是全部的话)要求至少一个字母和一个数字。我至少需要一封信。 我已经试过了,但还没有成功,我需要的是字符串只包含字母、字母+数字(任意顺序),允许破折号和空格,但不能在字符串的开头或结尾。下面是它现在的样子: protected static final String PATTERN = "[\u00C0-\u017Fa-zA-Z0-9']+([- ][\u00C0-\u017Fa-zA-Z0-9']+)*"; publi

我在SO和web上都发现了很多关于这个主题的变化,但大多数(如果不是全部的话)要求至少一个字母和一个数字。我至少需要一封信。 我已经试过了,但还没有成功,我需要的是字符串只包含字母、字母+数字(任意顺序),允许破折号和空格,但不能在字符串的开头或结尾。下面是它现在的样子:

protected static final String PATTERN = "[\u00C0-\u017Fa-zA-Z0-9']+([- ][\u00C0-\u017Fa-zA-Z0-9']+)*";

    public static void main(String[] args) {

        String name;

        //name = "Street"; // allowed
        //name = "Some-Street"; // allowed
        //name = "Street "; // not allowed
        //name = " Street"; // not allowed
        //name = "Street-"; // not allowed
        //name = "-Street"; // not allowed
        //name = "Street"; // allowed
        //name = "1 st street"; // allowed
        //name = "street 5"; // allowed
        name = "111"; // NOT allowed

        if (!Pattern.matches(PATTERN, name)) {
            System.out.println("ERROR!");
        } else System.out.println("OK!");
    }
}
如何添加检查是否至少有一个字符


不管它是在开头还是结尾,或者它和数字之间是否有空格或破折号。必须至少有一个字符。

如果我理解正确,并且根据您介绍的内容,您有以下条件:

  • 至少一封信
  • 可以包含数字(但仅当满足之前的条件时)
  • 仅当破折号和空格不在字符串的开头或结尾时,才允许使用它们
基于这些条件,以下正则表达式将起作用:

^(?![ -]|\d+$)[[:alnum:] -]+(?<![ -])$
正则表达式将无法匹配以下字符串(根据您的示例)

编辑 负面外观落后有时会在某些语言(如java)中引起问题

下面是我以前的正则表达式的一个改编版本,它使用负的前向查找而不是负的后向查找,以确保字符串不会以连字符
-
或空格
结尾

^(?![ -]|\d+$)(?:(?![ -]$)[\pL\pN -])+$

您可以看到此正则表达式正在使用中

您可以使用此正则表达式解决您的问题:

^(?=.*\pL)[\pL\pN]+(?:[ -]+[\pL\pN]+)*$

对于Java使用:

final String regex = "^(?=.*\\pL)[\\pL\\pN]+(?:[ -]+[\\pL\\pN]+)*$";
正则表达式分解:

  • ^
    :开始
  • (?=..*\pL)
    :使用前瞻确保我们至少有一个unicode字母
  • [\pL\pN]+
    :匹配一个或多个unicode字母或unicode数字
  • (?:
    :非捕获组启动
    • [-]+
      :匹配一个或多个空格或连字符
    • [\pL\pN]+
      :匹配一个或多个unicode字母或unicode数字
  • )*
    :非捕获组结束<代码>*表示此组中的零个或多个
  • $
    :结束

以下正则表达式执行此任务:

(?=.*[[:alpha:]])[[:alnum:]]{1}[[:alnum:] -]*[[:alnum:]]{1}
  • (?=.[:alpha:]])零件保证字母字符[A-Za-z] 存在于单词内部

  • [[:alnum:][1}部分保证字符串以字母数字开头 字符[A-Za-z0-9]

  • [[:alnum:][-]*字母数字字符、空格和破折号字符 可能存在于这里

  • [[:alnum:][1}部分保证字符串以字母数字结尾 字符[A-Za-z0-9]


要实时查看它

可能的副本,您需要至少一个字符还是一个字母?这是非常不同的。如果不允许在开头或结尾使用空格,那么在保存字符串之前使用
trim()
string不是更方便吗?空格通常不可见,这会让用户感到困惑和沮丧。A“是有效的输入吗?
trim()
可以在前端或后端使用。后端开发更适合字符串格式,因为用户无法关闭它。您绝对应该在后端清理字符串,而不要依赖任何基于前端的东西。@NenadBulatovic显然java不能很好地处理负面外观。我已经编辑了我的正则表达式,以使用负向前看而不是负向后看,以确保字符串不会以连字符或空格结尾
final String regex = "^(?=.*\\pL)[\\pL\\pN]+(?:[ -]+[\\pL\\pN]+)*$";
(?=.*[[:alpha:]])[[:alnum:]]{1}[[:alnum:] -]*[[:alnum:]]{1}