正则表达式适用于以下条件

时间:2017-12-14 19:54:05

标签: regex

我正在寻找以下场景的正则表达式。

  1. 正则表达式只允许使用数字
  2. 不要以-(hypen)
  3. 开头和结尾
  4. 在整数中,它应仅包含0或2 *(星号)
  5. 示例:

    *1,
    1*,
    1-1,
    1*-*1,
    *1-*1,
    *1-1
    1*-1,
    1-*1,
    1-1*,
    1**,
    1,
    **1
    **1-1
    1**-1
    1-**1,
    1-1**,
    1-*1*,
    *1*-1,
    1*11-*1
    

2 个答案:

答案 0 :(得分:1)

代码

See regex in use here。这个方法使用更少的步骤 - 360步骤 - (更好的性能)比我能想出的任何其他步骤(除了扩展第一个非捕获组 - 请参阅下一节中的第一个正则表达式 - 305步)。

^(?!(?:[^*\r\n]*\*){3})[\d*]+(?:-[\d*]+)?$

您还可以使用以下任何一项:

^(?![^*\r\n]*\*[^*\r\n]*\*[^*\r\n]*\*)[\d*]+(?:-[\d*]+)?$
^(?!-|(?:.*\*){3})[\d*-]*[\d*]$
^(?!-|(?:.*\*){3})[\d*-]+(?<!-)$

如果没有预测,你可以使用以下内容,但我警告你,这太丑了:

See regex in use here

^(?:\d+(?:\*?[\d-]*\*?|[\d-]*\*{0,2}[\d-]*)\d+|(?:\d*|\d[\d-]*)\*[\d-]*\*(?:\d*|[\d-]*\d)|(?:\d*|\d[\d-]*)\*(?:\d*|[\d-]*\d)|\d+)$

结果

输入

*1
1*
1-1
1*-*1
*1-*1
*1-1
1*-1
1-*1
1-1*
1**
1
**1
**1-1
1**-1
1-**1
1-1**
1-*1*
*1*-1
1*11-*1

-1*1
1*1*1*1
1-

输出

*1
1*
1-1
1*-*1
*1-*1
*1-1
1*-1
1-*1
1-1*
1**
1
**1
**1-1
1**-1
1-**1
1-1**
1-*1*
*1*-1
1*11-*1

说明

  • ^在行首处断言位置
  • (?!(?:[^*\r\n]*\*){3})否定前瞻,确保字符串包含不超过2个星号*(一旦找到第三个字符串就会取消字符串)
  • [\d*]+匹配数字或星号字符*一次或多次
  • (?:-[\d*]+)?匹配以下零次或一次
    • -按字面意思匹配
    • [\d*]+匹配数字或星号字符*一次或多次
  • $断言行尾的位置

答案 1 :(得分:0)

试试这个正则表达式:

(?!([^\s*]*[*]){3})(?!-)^[0-9*-]*(?!.*-)[0-9*]

演示:https://regex101.com/r/opC5PB/1