Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用模式中可变数量的特定字符构造正则表达式_Java_Regex - Fatal编程技术网

在Java中使用模式中可变数量的特定字符构造正则表达式

在Java中使用模式中可变数量的特定字符构造正则表达式,java,regex,Java,Regex,所以给出了一个文本文件,它应该遵循某种先验的已知格式。我想通过读取文本文件中的每一行并与正则表达式进行比较来检查这样的文本文件是否确实遵循了格式。因此,每个文本文件的第一行采用以下格式: 第一个字符是“O”(大写O) 字符2-16是数字,但第6个字符是空白 字符17-30是十进制数,其中字符28是小数点 字符31-40是一个整数 规范还在继续,但是我只需要步骤3和4的帮助。例如,十进制数可以是1000.55,但在文本文件中,它前面会有7个空格,以便符合格式。第4步也是如此:如果数字是10,那么

所以给出了一个文本文件,它应该遵循某种先验的已知格式。我想通过读取文本文件中的每一行并与正则表达式进行比较来检查这样的文本文件是否确实遵循了格式。因此,每个文本文件的第一行采用以下格式:

  • 第一个字符是“O”(大写O)
  • 字符2-16是数字,但第6个字符是空白
  • 字符17-30是十进制数,其中字符28是小数点
  • 字符31-40是一个整数
  • 规范还在继续,但是我只需要步骤3和4的帮助。例如,十进制数可以是1000.55,但在文本文件中,它前面会有7个空格,以便符合格式。第4步也是如此:如果数字是10,那么文本文件中会有8个空格,以便匹配

    如何构造检测此模式的正则表达式?由于空格的数量可能会改变,我不确定。我的想法是这样的:

    String regex=“O[0-9]{4}[0-9]{10}[]*[0-9]*,[0-9]{2}”


    第一个字母是“O”,后跟四位数字,然后是一个空格,然后是10位数字,然后是未指定数量的空格,然后是未指定数量的数字。最后是小数点和两位数。但这并没有将十进制数限制为仅14个字符!这是不幸的,我认为它不起作用。

    您可以匹配您知道发生次数的第一部分

    对于第3步和第4步,您可以使用正向lookahead来断言发生的数量

    在Java中,您还可以使用
    \h
    来匹配水平空白字符

    ^O\d{4} \d{10}(?=[ \d]{11}\.) *\d*\.\d\d(?=[ \d]{10}) {0,9}\d+
    
    在带有双反斜杠的Java中:

    String regex = "^O\\d{4} \\d{10}(?=[ \\d]{11}\\.) *\\d*\\.\\d\\d(?=[ \\d]{10}) {0,9}\\d+";
    
    • ^O
      在字符串开头匹配O
    • \d{4}\d{10}
      匹配4位数字、一个空格和10位数字
    • (?=[\d]{11}\)
    • *\d*\.\d\d
      匹配可选空格
      和2位数字(如果只有.22也应该匹配)
    • (?=[\d]{10})
      正向前瞻,从当前位置向右断言10个空格或数字
    • {0,9}\d+
      匹配0-9个空格和1+个数字

    如果字符串的长度总共为40个字符,则可以使用单个前瞻
    (?=[\d]{11}\)
    ,因为字符串长度为40个字符

    ^O(?=[\d .]{39}$)\d{4} \d{10}(?=[ \d]{11}\.) *\d*\.\d\d *\d+$
    

    如果每行的每个“字段”中的字符数是常量且已知,则不需要正则表达式。只需使用类
    java.lang.String
    的方法
    substring(int,int)
    。提取每个字段后,可以分别验证每个字段。也许可以为每个字段创建单独的正则表达式,例如,第二个字段的正则表达式可以是:
    \d{4}\d{10}
    感谢您的回复,所以如果我使用
    子字符串
    方法提取十进制数字段,我如何确保它遵循格式?例如,小数点后没有3位数字,或者两位数字之间出现空白。@Abra Ok!我想我在第一次阅读时错过了阅读你的全部答案,我会看一看的!那么,有没有办法让空格后跟总共是x个字符的数字(不是混合的!)形成一个模式呢?试试
    “O[0-9]{4}[0-9]{10}(?。{19})*[0-9]*,[0-9]{2}”