使用短划线和单引号验证名称字符串

时间:2015-04-17 20:50:58

标签: java regex

我正在尝试使用以下规范验证字符串:

"Non-empty string that contains only letters, dashes, or single quotes"

我正在使用String.matches("[a-zA-Z|-|']*"),但它没有正确捕获-个字符。例如:

Test         Result  Should Be
==============================
shouldpass   true    true
fail3        false   false
&fail        false   false
pass-pass    false   true
pass'again   true    true
-'-'-pass    false   true

所以“pass-pass”和“-'-'- pass”都失败了。我的正则表达式做错了什么?

4 个答案:

答案 0 :(得分:5)

您应该使用以下正则表达式:

[a-zA-Z'-]+

您的正则表达式允许文字|,并且您指定了范围,从||。连字符必须放在字符类的结尾或开头,如果要匹配文字连字符,则必须在中间转义。最后的+量化器将确保字符串非空。

另一种选择是包含所有Unicode字母:

[\p{L}'-]+

Java字符串:"[\\p{L}'-]+"

答案 1 :(得分:4)

可能的解决方案:

[a-zA-Z-']+

正则表达式出现问题:

  1. 如果您不想接受空字符串,请将*更改为+以接受一个或多个字符,而不是零或更多。

  2. character class中的字符由OR运算符隐式分隔。例如:

    正则表达式[abc]相当于此正则表达式a|b|c

    因此,当您看到正则表达式引擎在那里不需要OR运算符时,这意味着|将被视为简单的管道文字:

    [a|b]代表a|b个字符

  3. 您似乎知道-在字符类中具有特殊含义,即创建像a-z这样的字符范围。这意味着|-|将被正则表达式引擎视为||之间的字符范围(实际上只有一个字符:|),这看起来像是主要问题你的正则表达式。

    要创建-字面值,我们需要

    • 逃避\-
    • 将其放置在-无法解释为范围的位置。更确切地说,我们需要将它放置在无法访问角色的地方,这些角色可以用作左右范围指示符l-r,如:
      • 在字符类[- ...]开头(没有左范围字符)
      • 在角色类[... -]结束时(没有正确的范围字符)
      • 之后,A-Z-x - Z之类的其他范围已被用作表示范围结束A-Z的字符,因此无法在Z-x范围内重复使用。< / LI>

答案 2 :(得分:1)

这将有效:

[a-zA-Z'-]+

使用|将搜索范围,您只需要该特定字符。

Tested Here

答案 3 :(得分:0)

try {
    if (subjectString.matches("(?i)([a-z'-]+)")) {
        // String matched entirely
    } else {
        // Match attempt failed
    } 
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}

说明:

(?i)([a-z'-]+)
----------

Options: Case insensitive; Exact spacing; Dot doesn't match line breaks; ^$ don't match at line breaks; Default line breaks

Match the regex below and capture its match into backreference number 1 «([a-z'-]+)»
   Match a single character present in the list below «[a-z'-]+»
      Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
      A character in the range between “a” and “z” (case insensitive) «a-z»
      The literal character “'” «'»
      The literal character “-” «-»