我试图创建一个数字的正则表达式,其中7应该至少出现一次而且它不应该包含9
/[^9]//d+
我不知道如何让它至少包含7次
此外,它对以下示例失败
123459,它接受字符串,即使如此,还有一个9包含在那里
但是,如果我的字符串为95,则拒绝它,这是正确的
答案 0 :(得分:3)
(?=\d*7)(?!\d*9)\d+
\b(?=\d*7)[0-8]+\b
注意:此方法使用的步骤较少(170),而方法1 则包含406步。
或者,您也可以将[0-8]
替换为[^9\D]
here,这基本上是说不匹配9
或\D
(任何非数字字符。)
您也可以使用\b(?=[^7\D]*7)[0-8]+\b
看here,这会使步数从170减少到147。
\b[0-8]*7[0-8]*\b
注意:此方法在139步骤中使用的步骤比上述两种方法都少。这个正则表达式的唯一问题是你需要在模式中的多个位置识别有效字符。
**VALID**
123456780
7
1237412
**INVALID**
9
12345680
1234567890
12341579
注意:下面显示的是匹配的字符串。
123456780
7
1237412
(?=\d*7)
肯定前瞻确保随后是任何数字,然后7
字面意思(?!\d*9)
否定前瞻确保以下内容不任意数字,然后9
字面意思\d+
任意数字一次或多次\b
将该位置置为单词边界(?=\d*7)
肯定前瞻确保随后是任何数字,然后7
字面意思[0-8]+
匹配集0-8
\b
将该位置置为单词边界\b
将该位置置为单词边界[0-8]*
任意次数匹配任何数字(9除外)7
字面上匹配数字7
[0-8]*
任意次数匹配任何数字(9除外)\b
将该位置置为单词边界答案 1 :(得分:2)
一种方法是使用几个前瞻:
(?=[^7]*7)(?!.*9)^\d+$
<小时/>
请注意,您需要双倍转义Java
中的反斜杠,以便它变为:
(?=[^7]*7)(?!.*9)^\\d+$
答案 2 :(得分:0)
如果我发现没错,你需要一个接受包含至少一个7且排除9的所有数字的正则表达式。所以试试这个:
(?:[0-8]*7[0-8]*)+
如果您只想在正常文本中找到数字,请添加正则表达式的第一个和最后一个。
答案 3 :(得分:0)
这有点复杂,但它适用于您的用例:
(?=.*^[0-68-9]*7[0-68-9]*$)(?=^(?:(?!9).)*$).*$
第一个表达式恰好匹配一个出现的7个,只接受数字,第二个表达式测试不出现9个。