我正在尝试使用以下规范验证字符串:
"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”都失败了。我的正则表达式做错了什么?
答案 0 :(得分:5)
您应该使用以下正则表达式:
[a-zA-Z'-]+
您的正则表达式允许文字|
,并且您指定了范围,从|
到|
。连字符必须放在字符类的结尾或开头,如果要匹配文字连字符,则必须在中间转义。最后的+
量化器将确保字符串非空。
另一种选择是包含所有Unicode字母:
[\p{L}'-]+
Java字符串:"[\\p{L}'-]+"
。
答案 1 :(得分:4)
可能的解决方案:
[a-zA-Z-']+
正则表达式出现问题:
如果您不想接受空字符串,请将*
更改为+
以接受一个或多个字符,而不是零或更多。
character class中的字符由OR运算符隐式分隔。例如:
正则表达式[abc]
相当于此正则表达式a|b|c
。
因此,当您看到正则表达式引擎在那里不需要OR运算符时,这意味着|
将被视为简单的管道文字:
[a|b]
代表a
或|
或b
个字符
您似乎知道-
在字符类中具有特殊含义,即创建像a-z
这样的字符范围。这意味着|-|
将被正则表达式引擎视为|
和|
之间的字符范围(实际上只有一个字符:|
),这看起来像是主要问题你的正则表达式。
要创建-
字面值,我们需要
\-
-
无法解释为范围的位置。更确切地说,我们需要将它放置在无法访问角色的地方,这些角色可以用作左右范围指示符l-r
,如:
[- ...]
开头(没有左范围字符)[... -]
结束时(没有正确的范围字符)A-Z-x
- Z
之类的其他范围已被用作表示范围结束A-Z
的字符,因此无法在Z-x
范围内重复使用。< / LI>
答案 2 :(得分:1)
答案 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 “-” «-»