我想写一个匹配字符串的正则表达式,遵循以下规则:
a-z
A-Z
或0-9
,但不是.
或-
a-z
A-Z
0-9
-
.
符号.
和符号-
不是必需的。中间符号.
和' - '的正确组合:.
和-
(aaaaaaaaaaaaaaaa).
(aaaaaaaaaa.aaaaa)或除第一个和最后一个之外的任何位置
存在一个-
(aaaaa-aaaaaaaaa)或除了第一个和最后一个之外的任何位置
存在两个.
和-
(aaaaaaa -aaaaaa)或除第一个和最后一个之外的任何位置我不需要只使用正则表达式的java代码。
我试着写这样的^[a-zA-Z\d][a-zA-Z\d\.-]{14}[a-zA-Z\d]$
。但是这个正则表达式有一个问题:在中间(没有第一个和最后一个字符的孔字符串)可以存在符号.
-
而不是一次。例如,dfdsfdsfdsfd..dd
dfdsfdsfdsf...dd
dfdsfd--dsfd..dd
是我的表达式的正确字符串。希望我能完全解释我的需要:)
答案 0 :(得分:1)
这是一个正则表达式,它将禁止字符串中的多个连字符或点:
^(?!(?:.*-){2}|(?:.*\.){2})[a-zA-Z\d][a-zA-Z\d.-]{14}[a-zA-Z\d]$
^^^^^^^^^^^^^^^^^^^^^^^^^
请参阅regex demo
此模式在初始和最终位置也不允许.
和-
,因为第一个和最后一个字符类不允许它们。
答案 1 :(得分:1)
将fn
与\p{Alnum}++(?>\.\p{Alnum}*-?\p{Alnum}+|-\p{Alnum}*\.?\p{Alnum}+)?
方法一起使用,并使用matches
测试字符串的长度。
str.length() == 16
请注意,如果长度不是16,则根本不测试正则表达式。
if (str.length == 16 && str.matches("\\p{Alnum}++(?>\\.\\p{Alnum}*-?\\p{Alnum}+|-\\p{Alnum}*\\.?\\p{Alnum}+)?")) {
...
答案 2 :(得分:0)
要求只有一个点/破折号,请使用前瞻:
"^(?=[^-.]*[-.][^-.]*$)[a-zA-Z\\d][a-zA-Z\\d.-]{14}[a-zA-Z\\d]$";
注意:
一些测试代码:
String regex = "^(?=[^-.]*[-.][^-.]*$)[a-zA-Z\\d][a-zA-Z\\d.-]{14}[a-zA-Z\\d]$";
Stream.of("okdsfdsfdsfd.ddd","okdsfdsfdsfd-ddd","dfdsfdsfdsfd..dd", "dfdsfdsfdsf...dd", "dfdsfd--dsfd..dd", "aaaabbbbccccdddd", ".123456789012345")
.forEach(s -> System.out.println(s + " " + s.matches(regex)));
输出:
okdsfdsfdsfd.ddd true
okdsfdsfdsfd-ddd true
dfdsfdsfdsfd..dd false
dfdsfdsfdsf...dd false
dfdsfd--dsfd..dd false
aaaabbbbccccdddd false
.123456789012345 false