我正在寻找以下场景的正则表达式。
-
(hypen)*
(星号)示例:
*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
答案 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*-]+(?<!-)$
如果没有预测,你可以使用以下内容,但我警告你,这太丑了:
^(?:\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)