具有“ Joker”字符的Java Regex

时间:2018-08-10 09:35:21

标签: java regex metacharacters

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

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

我想匹配的是:

  • 至少2个字母数字字符(“?”和“ *”除外)
  • “ *”只能出现一次,并且只能出现在字符串的末尾
  • “?”可以出现多次
  • 完全没有空格

例如:

  
      
  • abcd =确定
  •   
  • ?bcd =确定
  •   
  • ab ??? =确定
  •   
  • ab * =确定
  •   
  • ab?* =确定
  •   
  • ?? cd =好
  •   
  • * ab =不合适
  •   
  • ??? =不好
  •   
  • ab cd =不正确
  •   
  • abcd =不正确(开头是空格)
  •   

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

3 个答案:

答案 0 :(得分:3)

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

说明:

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

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

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

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

Demo

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

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

Demo

答案 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?]*[*]?$