java正则表达式不能使用符号?和{n}在一起

时间:2016-01-14 16:38:43

标签: java regex

我想写一个匹配字符串的正则表达式,遵循以下规则:

  1. 第一个和最后一个位置可以是符号a-z A-Z0-9,但不是.-
  2. 字符串的孔长度为16个字符
    enter image description here
  3. 在中间可以存在符号a-z A-Z 0-9 - .符号.和符号-不是必需的。中间符号.和' - '的正确组合:
    不存在.-(aaaaaaaaaaaaaaaa)
    存在一个.(aaaaaaaaaa.aaaaa)或除第一个和最后一个之外的任何位置 存在一个-(aaaaa-aaaaaaaaa)或除了第一个和最后一个之外的任何位置 存在两个.-(aaaaaaa -aaaaaa)或除第一个和最后一个之外的任何位置
  4. 我不需要只使用正则表达式的java代码。 我试着写这样的^[a-zA-Z\d][a-zA-Z\d\.-]{14}[a-zA-Z\d]$。但是这个正则表达式有一个问题:在中间(没有第一个和最后一个字符的孔字符串)可以存在符号. -而不是一次。例如,dfdsfdsfdsfd..dd dfdsfdsfdsf...dd dfdsfd--dsfd..dd是我的表达式的正确字符串。希望我能完全解释我的需要:)

3 个答案:

答案 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