冥界3大法王 发表于 2024-10-20 21:50

有如下UTF8的INI文件,用正则表达式匹配多行

本帖最后由 冥界3大法王 于 2024-10-20 21:57 编辑

假设文本内容如下:
最终得到下面背景为红字的
https://static.52pojie.cn/static/image/hrline/2.gif



font_name=微软雅黑


01=X:\EmEditor24.4\64位的\Bak_EmEditor.exe
02=D:\ProcessActivityView_x64.exe
03=X:\看雪论坛精华\西班牙网站下载的全套CrackMe教学\000-100\0-temp\1-Teoria Basica\x64dbg_2024-9-7\x64\x64dbg.exe
04=X:\plugins\MoreTool.dp64
05=X:\x64\x64dbg.exe
06=D:\图文处理\录像工具类\Bandicam7.0.2.2138\bdcam.exe
07=X:\Registry Finder\RegistryFinder.exe
08=X:\GuitarPro_8.1.0.48\GuitarPro.exe
09=X:\GuitarPro_8.1.0.48\Prefetct8.exe
10=X:\BinaryNinja3.5.4526\binaryninja.exe
11=H:\ISO光盘及软盘镜像\启动管理效率提升\Everything\Everything64.exe
12=C:\Program Files\Internet Explorer\iexplore.exe
13=X:\GuitarPro_8.1.0.48\Patch_Patch_GuitarPro.exe
14=X:\16.注册表\注册表修改\RegWorkshopX64.exe
15=C:\Windows\regedit.exe
16=C:\Windows\notepad.exe






没了。。。{:301_974:}
https://static.52pojie.cn/static/image/hrline/2.gif

uses
RegularExpressions;

procedure TForm1.Button1Click(Sender: TObject);
var
reader: TStreamReader;
temp1: string;
match: TMatch;
begin
reader := TStreamReader.Create('x64dbg.ini', TEncoding.UTF8);
temp1 := reader.ReadToEnd;
match := TRegEx.Match(temp1, 'Recent\sFiles\].*(?=\[)', );   =========>难道这样写不对?

if match.Success then
begin
    ShowMessage(match.Value);
end
else
begin
    ShowMessage('匹配不成功');
end;
end;


不报错,输出结果不对。哪的原因呢?{:301_974:}

bigwahaha 发表于 2024-10-20 23:03

RecentFilesRegex = '\(.*?)(?=\[\w+\]|$)';
....
match := TRegEx.Match(temp1, RecentFilesRegex, ); // 使用 roSingleLine 选项

试试~

冥界3大法王 发表于 2024-10-20 23:12

bigwahaha 发表于 2024-10-20 23:03
RecentFilesRegex = '\(.*?)(?=\[\w+\]|$)';
....
match := TRegEx.Match(temp1, RecentF ...

匹配多了,修改成 :
match := TRegEx.Match(temp1, '\(.*?)(?=\[)', );
就对了。

涛之雨 发表于 2024-10-21 06:55

本帖最后由 涛之雨 于 2024-10-21 06:57 编辑

只看正则表达式的话

\[^\[]+

但是这样遇到带括号的配置就会出问题

最好的办法其实是一行行读取,然后匹配[开头的行作为分割

冥界3大法王 发表于 2024-10-21 07:20

涛之雨 发表于 2024-10-21 06:55
只看正则表达式的话




原来是涛哥哥来了。
其实最开始的时候我也想的是一行行地读取,然后去判断,然后里面还得有一个要得到的数字部分,又得使用循环,所以我一想干脆使用正则一次得到一部分,然后再使用一次正则得到最后的一部分目的就达到了。

塞北的雪 发表于 2024-10-21 09:31

本帖最后由 塞北的雪 于 2024-10-21 09:34 编辑



var
      FoundMatch: Boolean;

FoundMatch := False;
try
      FoundMatch := TRegEx.IsMatch(SubjectString, '(?<=\)(.*)(?=\)', );
except
      on E: ERegularExpressionError do begin
                // Syntax error in the regular expression
      end;
end;

冥界3大法王 发表于 2024-10-21 09:42

塞北的雪 发表于 2024-10-21 09:31
var
      FoundMatch: Boolean;



因为后面的那一部分不确定肯定是
所以只要断言一个【 的位置就行了。

塞北的雪 发表于 2024-10-21 10:38

冥界3大法王 发表于 2024-10-21 09:42
因为后面的那一部分不确定肯定是
所以只要断言一个【 的位置就行了。

那就更简单了,匹配“Recent Script]”到“[”之间的数据

(?<=Recent Files\])[^\[]*(?=\[)
页: [1]
查看完整版本: 有如下UTF8的INI文件,用正则表达式匹配多行