如何在没有正则表达式的情况下解析它?

Inc*_*ito 1 regex parsing text sabre

我的一个朋友说,如果我使用的正则表达式太长,那可能是错误的工具.有什么想法可以更好地解析这个文本吗?我有一个正则表达式,将所有内容返回到一个数组,我可以很容易地将其分块,但如果有另一种更简单的方法,我真的很想看到它.

这是它的样子:

 2 AB 123A 01JAN M ABCDEF AA1   100A  200A  02JAN T /ABCD /E    
Run Code Online (Sandbox Code Playgroud)

这是一个细分:

  • 2是行号,这些行从1一直到99.如果由于格式化而无法看到,则会有一个小于10的空格字符.

    该空间可能会或可能不会被替换 *

  • AB 是一个重要的数据单位(UOD).

    AB可以预先/CD设定另一个重要的UOD.

  • 123是一个重要的UOD.它的范围可以从1(前置4个空格)到99999.

  • A 是一个重要的UOD.

  • 01JAN 是一个日/月组合,我需要提取两个UOD.

  • M是一天的简称.这可能是1和之间的数字7.

  • ABC 是一个重要的UOD.

  • DEF 是一个重要的UOD.

    之后的空间DEF可能是一个*

  • AA1 可能是零个字符,或者它可能是5.它不重要.

  • 100A是时间戳,但可能是格式1300.该AN当时间1200P在下午的时间.

  • 然后我们看到另一个时间戳.

  • 下一个日期部分可能不在那里,例如,这是有效的:

    93*DE/QQ51234 30APR J QWERTY*QQ0   1250   0520 /ABCD*ASDFAS /E             
    
    Run Code Online (Sandbox Code Playgroud)
  • /ABCD*ASDFAS /E出现的数据与应用程序无关,但是,这是第二个日期戳可能出现的位置.前斜线可能是其他东西(例如字母).

注意:
它不是以空格分隔的,身体的某些部分会遇到其他部分.字符位置仅对列表中的前两个或三个项目准确

我不认为我遗漏了任何东西,但是,如果有一种更简单的方法来解析这样的字符串而不是写一个正则表达式,请告诉我.

Joh*_*ica 6

这是正则表达式的完美任务.文本不包含嵌套,您匹配的项目相当简单.

大多数正则表达式语法都有x标记或模式,允许空格和注释提高可读性.例如:

$regex = '@
    # 2 is the line number, these range from 1 all the way to 99.
    # There is a space character prepending numbers less than 10.
    # The space may or may not be replaced by an *.
    [ *]\d|\d\d
    \s

    # AB is an important unit of data (UOD).
    # AB may be prepended by /CD which is another important UOD.
    (/CD)?AB
    \s

    # 123 is an important UOD. It can range from 1 (prepended by 4 spaces)
    # to 99999.
    \s{4}\d{1}|\s{3}\d{2}|\s{2}\d{3}|\s{1}\d{4}|\d{5}
@x';
Run Code Online (Sandbox Code Playgroud)

等等.