我尝试让正则表达式验证输入字段。 我所说的“小丑”字符是“?”和“ *”。 这是我的Java正则表达式:
"^$|[^\\*\\s]{2,}|[^\\*\\s]{2,}[\\*\\?]|[^\\*\\s]{2,}[\\?]{1,}[^\\s\\*]*[\\*]{0,1}"
我想匹配的是:
- abcd =确定
- ?bcd =确定
- ab ??? =确定
- ab * =确定
- ab?* =确定
- ?? cd =好
- * ab =不合适
- ??? =不好
- ab cd =不正确
- abcd =不正确(开头是空格)
我使正则表达式有点复杂,我迷路了,你能帮我吗?
答案 0 :(得分:3)
^(?:\?*[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?]*\*?$
答案 1 :(得分:0)
您在这里:
VERSION BUILD=10021450
URL GOTO=https://www.website.net/index.php
WAIT SECONDS=5
TAG POS=13 TYPE=INPUT:CHECKBOX ATTR=* CONTENT=YES
TAG POS=1 TYPE=A ATTR=TXT:Subscribers
WAIT SECONDS=3
TAG POS=1 TYPE=A ATTR=TXT:View
WAIT SECONDS=5
URL GOTO=javascript:fbwin.close();checkChild();
两者在Regex101上的演示中都有描述。
^\?*\w{2,}\?*\*?(?<!\s)$
是字符串的开头^
表示任意数量的初始\?*
字符(必须转义)?
至少2个字母数字字符\w{2,}
继续以任意数量的\?*
个字符?
和最后一个\*?
个字符*
和整个字符串不能包含(?<!\s)
白色字符(使用负向后看)\s
是字符串的结尾答案 2 :(得分:0)
解决此问题的其他方法可以使用look-ahead机制(?=subregex)
。它是zero-length(它将正则表达式光标重置为执行subregex
之前的位置),因此它使regex引擎可以通过构造
(?=condition1)
(?=condition2)
(?=...)
conditionN
注意:未在conditionN
中放置最后一个条件((?=...)
),以使正则表达式引擎在经过测试的零件之后移动光标(以“消耗”它)并继续移动到之后测试其他东西。但是要使conditionN
必须精确匹配我们要“消费”的那部分(以前的条件没有此限制,它们可以匹配任何长度的子字符串,例如让我们说)前几个字符)。
所以现在我们需要考虑一下我们的条件。
我们只想匹配alphanumeric characters
,?
,*
,但是*
只能出现在结尾(可选)。我们可以将其写为^[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?]*[*]?$