java - 正则表达式匹配字母数字字符和一个 *,总长度应为 3

标签 java javascript regex

如何为字母数字字符编写正则表达式,允许一个或两个星号并将字符串总长度限制为 3。

例如:下面的字符串长度为 3

*12  or *2* 0r *a* or *B* or **2

因此,* 符号可以出现在 *12 的最后、中间或第一个。同样,如果您采用最后一个示例 **2,您会看到多个 * 符号,并且可以以该字符串的任何顺序出现。

最佳答案

您始终可以在 JavaScript 中使用前瞻断言。它有点棘手,但它更适合微调任何特定的排列。

/^(?=(?:[^*]*\*){1,2}[^*]*$)[a-zA-Z0-9*]{3}$/

扩展:

^                        # beginning of line
  (?=                         # start lookahead
      (?:                       # non-capture group
          [^*]*                    # optional not '*' characters
          \*                       # '*' character
      ){1,2}                    # end group, do 1 or 2 times
      [^*]*                     # optional not '*' characters
      $                         # end of line
  )                          # end lookahead
  [a-zA-Z0-9*]{3}            # back at begining of line. at this point there will
                             # be only 1 or 2 '*' characters in the line.
                             # match exactly 3 of alphanumeric characters or '*'
$                        # end of line       

替换您需要的任何要求。
下面是一个perl测试用例,javascript不是我的强项。

@samps = qw(
 *12  1*2  12*  **1  *1*  1**  ***
 a*12 a1*2 a12* **a1 *a1* a1** ****
 *2   *2   2*   *1   1*   **   
);

for $teststr (@samps) {
   if ($teststr =~ /^(?=(?:[^*]*\*){1,2}[^*]*$)[a-zA-Z0-9*]{3}$/) {
      print "$teststr passed\n";
   }
   else {
      print "$teststr failed\n";
   }
}

输出:

*12 passed
1*2 passed
12* passed
**1 passed
*1* passed
1** passed
*** failed
a*12 failed
a1*2 failed
a12* failed
**a1 failed
*a1* failed
a1** failed
**** failed
*2 failed
*2 failed
2* failed
*1 failed
1* failed
** failed

编辑@bozdoz

我没有意识到一个字符串可能会被多次删除。如果是这样,则可以将正则表达式推广为带/不带分隔符使用。
重要的是,如果要求更改为(例如总共 8 个字符且只有 2-4 个星号),这可以很好地扩展。

示例:

除了字符串的开始/结束之外没有分隔符:

  /
    ^
     (?= [a-z0-9*]{3} $ )
     (?:[a-z0-9]*\*){1,2} [a-z0-9]*
    $
  /xi

分隔符为\s,上下文是单行且全局的。数据在组 1 中捕获

 /
   (?:^|\s)
    (?= [a-z0-9*]{3} (?:$|\s) )
    ( (?:[a-z0-9]*\*){1,2} [a-z0-9]* )
   (?=$|\s)
 /xig

分隔符为[^a-z0-9*],上下文是单行且全局的。数据在组 1 中捕获

 /
   (?:^|[^a-z0-9*])
    (?= [a-z0-9*]{3} (?:$|[^a-z0-9*]) )
    ( (?:[a-z0-9]*\*){1,2} [a-z0-9]* )
   (?=$|[^a-z0-9*])
 /xig

关于java - 正则表达式匹配字母数字字符和一个 *,总长度应为 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8291161/

相关文章:

javascript - 在 Highcharts 中显示所有图例项的按钮

javascript - Jquery 菜单数组在错误的位置打开 ul

javascript - JS正则表达式根据不以反斜杠开头的字符拆分字符串

javascript - ^((?<!\/)\/[A-Za-z0-9_-]*)+$ 的正则表达式无效量词

java - 嵌入式 XSD 中的 JAXB 绑定(bind)

javascript - 如何使用 jQuery 定位 fullpage.js 的当前 "stage"

java - 分布式 session 处理

python - 查找 pandas.Series 中的所有非数字元素

java - 图像读取大小异常 : I/O error reading PNG header!

java - Spring MVC : JSP or JSON view in Controller method depending on request