我正在解析(通过正则表达式)由ARM链接器生成的.map文件。我已经提取了很多东西,但这部分是抵制的。
以下是我要解析的部分的摘录
^ COMMON\s+(0x\S+)\s+(0x\S+).*(?:\s+(0x\S+)\s+(\S+)[\r\n])*(?:\s+\*fill\*\s+0x\S+\s+(0x\S+))?
这是我最好的正则表达式尝试:
COMMON
可以检查结果here。我得到的结果只匹配块的最后一行(我认为它是以[{
'name': 'GLB_appIntObjPropChangeFlags',
'size': 0x01,
'path': './2_Programa/source/interface_objects.o',
'origin': 0x20002b19
},
{
'name': 'GLB_aioBLCommand',
'size': 0x87,
'path': './2_Programa/source/interface_objects.o',
'origin': 0x20002b1a
},
...
]
开头的块。)
我需要提取的内容与此类似:
COMMON 0x20002b19 0x87 ./2_Programa/source/interface_objects.o`
我的主要问题是我无法分开第一行
0x20002b19 GLB_appIntObjPropChangeFlags
0x20002b1a GLB_aioBLCommand
0x20002b65 GLB_aioDateTime
来自与之相关的其他人
COMMON
任何人都可以给出一些暗示来解决这个问题吗?
更新
我想要做的是将所有块(以COMMON 0x20002b19 0x87 ./2_Programa/source/interface_objects.o`
开头的块)分成两部分。第1组:
0x20002b19 GLB_appIntObjPropChangeFlags
0x20002b1a GLB_aioBLCommand
0x20002b65 GLB_aioDateTime
和Group2:
^ COMMON\s+(0x\S+)\s+(\S+)\s+(\S+)
然后,我可以分别对每个组进行正则表达式:
第1组的正则表达式:
^\s+(0x\S+)\s+(\S+)
和另一组2(设置多行标志):
dict
因此,我将从第一个正则表达式获得三个组,其他六个组(每3行每个线数2个)可以轻松转换为<md-icon class="material-icons md-72" ng-click="showAdvanced($event)" role="button">assignment</md-icon>
的列表,如上所示。
答案 0 :(得分:2)
实际上,您应该Wiktor Stribiżew抓住问题评论中提到的每个COMMON
块。链接到Wiktor的正则表达式here。正则表达式没有能力遍历子查询(这不是它的目的)。
不切实际,您可以使用此正则表达式来抓取每个COMMON
部分及其后续块,然后映射它。
(?:COMMON\s+0x[0-9a-f]+\s+(0x[0-9a-f]+)\s+(\S+)|\s*(0x[0-9a-f]+)\s+(\S+))(?=\s*[\r\n])
COMMON\s+0x[0-9a-f]+\s+(0x[0-9a-f]+)\s+(\S+)
选项1
COMMON\s+0x[0-9a-f]+\s+
COMMON
字符COMMON
字面意思\s+
一个或多个空白字符0x
这些字符0x
字面意思[0-9a-f]+
集0-9a-f
\s+
一个或多个空白字符\s+
(0x[0-9a-f]+)
将以下内容捕获到捕获组1中
0x
这些字符0x
字面意思[0-9a-f]+
集0-9a-f
\s+
一个或多个空白字符(\S+)
将一个或多个非空白字符捕获到捕获组2 \s*(0x[0-9a-f]+)\s+(\S+)
选项2
\s*
任意数量的空白字符(0x[0-9a-f]+)
将以下内容捕获到捕获组3中
0x
这些字符0x
字面意思[0-9a-f]+
集0-9a-f
\s+
一个或多个空白字符(\S+)
将一个或多个非空白字符捕获到捕获组4 (?=\s*[\r\n])
确保以下内容是任意数量的空白字符,后跟换行符\r\n
根据匹配的顺序及其所属的组,您可以将它们映射到您演示的数组。
例如(按比赛顺序)。
0x1
./2_Programa/source/board.o
0x20002b18
BOARD_ctx
0x87
./2_Programa/source/interface_objects.o
0x20002b19
GLB_appIntObjPropChangeFlags
0x20002b1a
GLB_aioBLCommand
0x20002b65
GLB_aioDateTime
始终将第1组和第2组的最后一场比赛与第3组和第4组的当前比赛相关联