带“的Java正则表达式”;“小丑”;人物

带“的Java正则表达式”;“小丑”;人物,java,regex,metacharacters,Java,Regex,Metacharacters,我尝试使用正则表达式验证输入字段。 我称之为“小丑”的角色是“?”和“*”。 这是我的java正则表达式: "^$|[^\\*\\s]{2,}|[^\\*\\s]{2,}[\\*\\?]|[^\\*\\s]{2,}[\\?]{1,}[^\\s\\*]*[\\*]{0,1}" 我想说的是: 最少2个字母数字字符(除“?”和“*”外) “*”只能在字符串末尾出现一次 “?”可以多次出现 完全没有空格 例如: abcd=正常 ?bcd=正常 ab???=嗯 ab*=正常 ab?*=正常 ??c

我尝试使用正则表达式验证输入字段。 我称之为“小丑”的角色是“?”和“*”。 这是我的java正则表达式:

"^$|[^\\*\\s]{2,}|[^\\*\\s]{2,}[\\*\\?]|[^\\*\\s]{2,}[\\?]{1,}[^\\s\\*]*[\\*]{0,1}"
我想说的是:

  • 最少2个字母数字字符(除“?”和“*”外)
  • “*”只能在字符串末尾出现一次
  • “?”可以多次出现
  • 完全没有空格
例如:
  • abcd=正常
  • ?bcd=正常
  • ab???=嗯
  • ab*=正常
  • ab?*=正常
  • ??cd=正常
  • *ab=不正常
  • ??=不好
  • ab cd=不正常
  • abcd=不正常(开头有空格)
我把正则表达式弄得有点复杂,我迷路了,你能帮我吗

^(?:\?*[a-zA-Z\d]\?*){2,}\*?$
说明:

正则表达式断言此模式必须出现两次或两次以上:

\?*[a-zA-Z\d]\?*
它断言类
[a-zA-Z\d]
中必须有一个字符,其左侧或右侧有0到无穷多个问号

然后,正则表达式匹配字符串末尾的
\*?
,表示0或1星号字符

下面是一个更快的替代正则表达式,正如revo在评论中所建议的:

^(?:\?*[a-zA-Z\d]){2}[a-zA-Z\d?]*\*?$
说明:

正则表达式断言此模式必须出现两次或两次以上:

\?*[a-zA-Z\d]\?*
它断言类
[a-zA-Z\d]
中必须有一个字符,其左侧或右侧有0到无穷多个问号

然后,正则表达式匹配字符串末尾的
\*?
,表示0或1星号字符

下面是一个更快的替代正则表达式,正如revo在评论中所建议的:

^(?:\?*[a-zA-Z\d]){2}[a-zA-Z\d?]*\*?$
给你:

^\?*\w{2,}\?*\*?(?<!\s)$
^\?*\w{2,}\?**?(?
在中描述的和在中演示的

  • ^
    是字符串的开头
  • \?*
    表示任何数量的初始
    字符(必须转义)
  • \w{2,}
    至少2个字母数字字符
  • \?*
    以任意数量和
    字符继续
  • \*?
    和可选的最后一个
    *
    字符
  • (?和整个字符串必须没有
    \s
    白色字符(使用负数查找)
  • $
    是字符串的结尾
    • 给你:

      ^\?*\w{2,}\?*\*?(?<!\s)$
      
      ^\?*\w{2,}\?**?(?
      在中描述的和在中演示的

      • ^
        是字符串的开头
      • \?*
        表示任何数量的初始
        字符(必须转义)
      • \w{2,}
        至少2个字母数字字符
      • \?*
        以任意数量和
        字符继续
      • \*?
        和可选的最后一个
        *
        字符
      • (?和整个字符串必须没有
        \s
        白色字符(使用负数查找)
      • $
        是字符串的结尾

      解决此问题的另一种方法是使用机制
      (?=subsectex)
      。它是(它在执行
      subsectex
      之前将正则表达式光标重置为原来的位置),因此它允许正则表达式引擎通过构造对同一文本执行多个测试

      (?=condition1)  
      (?=condition2)
      (?=...)
      conditionN       
      
      注意:最后一个条件(
      condition n
      )并没有放在
      (?=…)
      中,以允许正则表达式引擎在被测试部分之后移动光标(以“使用”它),并在被测试部分之后继续测试其他内容。但要使之成为可能,
      condition n
      必须精确匹配我们想要“使用”的部分(早期的条件没有这个限制,它们可以匹配任何长度的子字符串,比如说前几个字符)

      所以现在我们需要考虑我们的条件是什么

      • 我们只想匹配
        字母数字字符
        *
        ,但
        *
        只能(可选)出现在末尾。我们可以将其写成
        ^[a-zA-Z0-9?]*[*]?$
        。这也会处理非空白字符,因为我们没有将它们作为潜在的可接受字符

      • 第二个要求是“至少2个字母数字字符”。它可以写成
        *?[a-zA-Z0-9].*?[a-zA-Z0-9]
        (?:*?[a-zA-Z0-9]){2,}
        (如果我们喜欢较短的正则表达式的话)。由于该条件实际上并不测试整个文本,而只测试其中的一部分,所以我们可以将其置于前瞻机制中

      上述条件似乎涵盖了我们想要的所有内容,因此我们可以将它们合并到正则表达式中,该正则表达式可以如下所示:


      ^(?=(?:.*[a-zA-Z0-9]){2,}[a-zA-Z0-9?]*[*]?$
      解决此问题的另一种方法是使用机制
      (?=subsectex)
      。它是(在执行
      subsectex
      之前重置regex光标的位置),因此它允许regex引擎通过构造对同一文本执行多个测试

      (?=condition1)  
      (?=condition2)
      (?=...)
      conditionN       
      
      注意:最后一个条件(
      condition n
      )并没有放在
      (?=…)
      中,以允许正则表达式引擎在被测试部分之后移动光标(以“使用”它),并在被测试部分之后继续测试其他内容。但要使之成为可能,
      condition n
      必须精确匹配我们想要“使用”的部分(早期的条件没有这个限制,它们可以匹配任何长度的子字符串,比如说前几个字符)

      所以现在我们需要考虑我们的条件是什么

      • 我们只想匹配
        字母数字字符
        *
        ,但
        *
        只能(可选)出现在末尾。我们可以将其写成
        ^[a-zA-Z0-9?]*[*]?$
        。这也会处理非空白字符,因为我们没有将它们作为潜在的可接受字符

      • 第二个要求是“至少有2个字母数字字符”。它可以写成
        *?[a-zA-Z0-9].*?[a-zA-Z0-9]
        (?:.*[a-zA-Z0-9]){2,}
        (如果我们喜欢较短的正则表达式的话)。由于该条件实际上并不测试整个文本,而只测试其中的一部分,我们可以将其放在前瞻mec中