Java Regex匹配字符前后的空格

时间:2018-08-14 12:17:26

标签: java regex pattern-matching whitespace wildcard

我尝试让正则表达式验证输入字段。

此问题是 this question 的继续,但我犯了一个错误,并且问题有所改变,因此我创建了一个新问题。

这是我的Java正则表达式:

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

Demo

我想匹配的是:

  • 至少2个字母数字字符(“?”和“ *”除外)
  • “ *”只能出现一次,并且只能出现在字符串的末尾
  • “?”可以出现多次
  • 开头没有空格
  • 在'?'之前或之后没有空格。或“ *”
  

例如:

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

正如我在fisrt问题中所问的那样,正则表达式中现在完全不允许使用空格,但这不是我想要的,我有点迷茫了,您能帮我吗?

1 个答案:

答案 0 :(得分:2)

您可以使用

^(?!\s)(?!.*\s[*?])(?!.*[*?]\s)(?:[?\s]*[a-zA-Z0-9]){2}[a-zA-Z0-9?\s]*\*?$

请参见regex demo

用法说明:如果将其与Java的.matches()方法一起使用,则可以从模式中删除^$。请记住在字符串文字中将转义的反斜杠加倍。

详细信息

  • ^-字符串的开头
  • (?!\s)-不允许在右边(在字符串的开头)使用空格
  • (?!.*\s[*?])-在*?之前,尽可能多的0个字符之后,不允许有空格。
  • (?!.*[*?]\s)-在*?之后,尽可能多的0个字符后不允许有空格
  • (?:[?\s]*[a-zA-Z0-9]){2}-两个序列
    • [?\s]*-0个或更多?或/和空格
    • [a-zA-Z0-9]-一个字母数字字符
  • [a-zA-Z0-9?\s]*-0个或更多字母,数字,?或空格
  • \*?-可选的?字符
  • $-字符串的结尾。