【发布时间】:2013-09-01 22:30:12
【问题描述】:
我正在尝试获取一个例程,该例程将找到一个不跟随括号的字符串。例如,如果在 RichEdit 中打开的文件包含这些 CNC 代码行,我希望它找到前两行并忽略第三行。在第二行中,它应该只找到并突出显示搜索字符串的第一次出现。本例中的搜索字符串 (mach.TOOL_CHANGE_CALL) 为 'T'。
N1T1M6
N1T1M6(1/4-20 TAP .5 DP.)
(1/4-20 TAP .5 DP.)
我已经走到这一步了,但我很难过。
procedure TMainForm.ToolButton3Click(Sender: TObject); // find tool number
var
row:integer;
sel_str:string;
par:integer;
tool:integer;
tool_flag:integer ;
line_counter:integer;
tool_pos:integer;
line_begin:integer;
RE:TRichEdit;
begin
RE:=(ActiveMDIChild as TMDIChild).RichEdit1;
line_counter:=0;
tool_flag:=0;
tool_pos:=0;
row:=SendMessage(RE.Handle,EM_LINEFROMCHAR,-1, RE.SelStart);
while tool_flag =0 do
begin
RE.Perform(EM_LINESCROLL,0,line_counter);
sel_str := RE.Lines[Line_counter];
tool:=pos(mach.TOOL_CHANGE_CALL,sel_str);
par:=pos('(',sel_str);
if par=0 then
par:=pos('[',sel_str);
tool_pos:=tool_pos+length(sel_str);
if (tool>0) and (par = 0) then
begin
RE.SetFocus;
tool_pos:=tool_pos + line_counter-1;
line_begin:=tool_pos-tool;
RE.SelStart := line_begin;
RE.SelLength := Length(sel_str);
tool_flag:=1;
end;
inc (line_counter);
end;
end;
我得到的结果是它会忽略第三个字符串,但也会忽略第二个字符串。它也不会在文件中找到随后出现的字符串,它只是从文本的开头重新开始并再次找到第一个。如何让它找到第二个示例,然后在下次单击按钮时找到下一个“T”?我还需要它来突出显示搜索字符串所在的整行。
【问题讨论】:
-
我不确定我是否理解您的要求。如果您的搜索表达式是“T”,您的建议是只匹配两次出现的“N1T1M6”,而不匹配任何一次出现的
TAP? -
正确,它应该只找到不在括号内的 T。在 CNC 代码中,括号内的文本是 cmets。我试图仅在代码中找到实际工具('T')更改位置,并且始终位于 cmets 之外。它也找不到任何其他在括号内包含 T 的单词。
-
最后一个信息请求。测试是否如您列出的那样(每行一个“命令”)?或者它是一个连续的文本块?恐怕我对CNC代码不熟悉。如果每行一个命令,用正则表达式应该很容易处理。
-
不太确定我是否遵循了这个问题。但我会试一试。 CNC 代码包含多行文本,有时甚至达到数百万行。我们需要能够在所有这些行中快速找到换刀位置 ('T')。这些工具更改调用可能多达 60 个,但它们看起来总是与我给您的示例相似。有时描述工具的注释会在换刀调用之前的行 ('T') 有时在同一行,有时在之后的行。所以我需要忽略那些注释行,即使它们包含 T
-
如果找到 'par',您可以搜索匹配的 par-close (?),然后忽略中间的匹配。您可以使用 PosEx 从某个位置开始搜索。