带“的Java正则表达式”;“小丑”;人物
我尝试使用正则表达式验证输入字段。 我称之为“小丑”的角色是“?”和“*”。 这是我的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
"^$|[^\\*\\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中