0

我尝试让正则表达式验证输入字段。我所说的“小丑”字符是“?” 和 '*'。这是我的 java 正则表达式:

"^$|[^\\*\\s]{2,}|[^\\*\\s]{2,}[\\*\\?]|[^\\*\\s]{2,}[\\?]{1,}[^\\s\\*]*[\\*]{0,1}"

我要匹配的是:

  • 最少 2 个字母数字字符(“?”和“*”除外)
  • '*' 只能出现一次并且出现在字符串的末尾
  • 这 '?' 可以出现多次
  • 根本没有空白

例如:

  • abcd = 好的
  • ?bcd = 好的
  • ab?? = 好的
  • ab*= 好的
  • ab?* = 好的
  • ??cd = 好的
  • *ab = 不正常
  • ???= 不好
  • ab cd = 不正常
  • abcd = 不好(开头有空格)

我让正则表达式有点复杂,我迷路了你能帮我吗?

4

3 回答 3

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

解释:

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

\?*[a-zA-Z\d]\?*

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

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

演示

正如评论中建议的那样,这是一个更快的替代正则表达式:

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

演示

于 2018-08-10T09:51:57.587 回答
0

解决此问题的其他方法可能是使用前瞻机制(?=subregex)。它是零长度(它将正则表达式光标重置为执行前的位置subregex),因此它允许正则表达式引擎通过构造对同一文本进行多次测试

(?=condition1)  
(?=condition2)
(?=...)
conditionN       

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

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

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

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

以上条件似乎涵盖了我们想要的所有条件,因此我们可以将它们组合成正则表达式,如下所示:

^(?=(?:.*?[a-zA-Z0-9]){2,})[a-zA-Z0-9?]*[*]?$

于 2018-08-10T10:52:19.120 回答
0

干得好:

^\?*\w{2,}\?*\*?(?<!\s)$

两者都在Regex101演示。

  • ^是字符串的开始
  • \?*表示任意数量的初始?字符(必须转义)
  • \w{2,}至少 2 个字母数字字符
  • \?*以任意数量的 and?字符继续
  • \*?和可选的最后一个*字符
  • (?<!\s)并且整个字符串必须没有\s白色字符(使用负后视)
  • $是字符串的结尾
于 2018-08-10T09:54:09.870 回答