有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于数字的java正则表达式

我正在尝试创建一个数字正则表达式,其中7应该至少出现一次,而不应该包含9

/[^9]//d+

我不知道如何使它至少包含7次

此外,对于下面的示例,它也失败了

123459,它接受字符串,即使是tho,其中也包含一个9

但是,如果我的字符串是95,它会拒绝它,这是正确的


共 (4) 个答案

  1. # 1 楼答案

    这有点复杂,但它适用于您的用例:

    (?=.*^[0-68-9]*7[0-68-9]*$)(?=^(?:(?!9).)*$).*$
    

    第一个表达式正好匹配一个出现的7,只接受数字,第二个表达式测试不出现9

    试试这里:https://regex101.com/r/5OHgIr/1

  2. # 2 楼答案

    代码

    方法1

    See regex in use here

    (?=\d*7)(?!\d*9)\d+
    

    EH2<3>

    See regex in use here

    \b(?=\d*7)[0-8]+\b
    

    注意:与方法1的406个步骤相比,该方法使用的步骤更少(170)

    或者,您也可以用[^9\D]替换[0-8],如here所示,这基本上是说不匹配9\D(任何非数字字符)

    您还可以使用\b(?=[^7\D]*7)[0-8]+\b,如here所示,这将步骤数从170减少到147

    方法3

    See regex in use here

    \b[0-8]*7[0-8]*\b
    

    注意:与上述两种方法相比,该方法使用的步骤较少,共139步。这个正则表达式的唯一问题是需要在模式中的多个位置识别有效字符


    结果

    输入

    **VALID**
    
    123456780
    7
    1237412
    
    **INVALID**
    
    9
    12345680
    1234567890
    12341579
    

    输出

    注意:下面显示的是匹配的字符串

    123456780
    7
    1237412
    

    解释

    方法1

    • (?=\d*7)正向前瞻确保后面是任意数字任意次数,后面紧跟7
    • (?!\d*9)负向前看,确保后面的是而不是任何数字,后面是9
    • \d+任意数字一次或多次

    方法2

    • \b将位置断言为单词边界
    • (?=\d*7)正向前瞻确保后面是任意数字任意次数,后面紧跟7
    • [0-8]+匹配集合中存在的任何字符0-8
    • \b将位置断言为单词边界

    方法3

    • \b将位置断言为单词边界
    • [0-8]*匹配任意数字(9除外)任意次数
    • 7按字面意思匹配数字7
    • [0-8]*匹配任意数字(9除外)任意次数
    • \b将位置断言为单词边界
  3. # 3 楼答案

    一种方法是使用几个lookahead:

    (?=[^7]*7)(?!.*9)^\d+$
    

    a demo on regex101.com


    请注意,您需要对Java中的反斜杠进行双重转义,以便它变成:
    (?=[^7]*7)(?!.*9)^\\d+$
    
  4. # 4 楼答案

    如果我没弄错的话,你需要一个正则表达式,它接受所有至少包含一个7和排除9的数字。所以试试这个:

    (?:[0-8]*7[0-8]*)+
    

    如果希望在普通文本中只找到数字,请添加\s第一个和最后一个正则表达式