Regex是一个源代码文件
我有一个文本,这是一个源代码文件,我需要找到这个函数的所有调用的第一个参数。这可以通过以下两种方式调用。我完全不懂正则表达式Regex是一个源代码文件,regex,delphi,static-analysis,Regex,Delphi,Static Analysis,我有一个文本,这是一个源代码文件,我需要找到这个函数的所有调用的第一个参数。这可以通过以下两种方式调用。我完全不懂正则表达式 lang('FOUND')和lang('FOUND',[loremipsum]) 找到的应该是任何东西,这是我正在搜索的值 我将在delphi中执行Regexp,但我认为正则表达式与语言无关 编辑 使用@Ken White答案和这个我做了这个代码,效果很好 正则表达式:(?:lang\s*\(\s*')(.*)(.?(:'\s*\)\s*\,\s*\[.\]\s*\)
lang('FOUND')
和lang('FOUND',[loremipsum])
找到的应该是任何东西,这是我正在搜索的值
我将在delphi中执行Regexp,但我认为正则表达式与语言无关
编辑
使用@Ken White答案和这个我做了这个代码,效果很好 正则表达式:
(?:lang\s*\(\s*')(.*)(.?(:'\s*\)\s*\,\s*\[.\]\s*\)
在使用中包括该装置
procedure TForm1.Button1Click(Sender: TObject);
var
Regex: TPerlRegEx;
begin
Regex := TPerlRegEx.Create();
Regex.RegEx := '(?:lang\s*\(\s*'')(.*?)(?:''\s*\)|''\s*,\s*\[.*\]\s*\))';
Regex.Options := [preCaseless, preMultiLine];
Regex.Subject := Memo1.Text;
if Regex.Match then
begin
repeat
Memo2.Lines.Add( Regex.Groups[1] );
until not Regex.MatchAgain;
end;
end;
(下面的所有代码都是由生成的;我还使用它来创建所使用的正则表达式。SubjectString
是源文件的内容,加载到字符串中;例如,您可以将源文件加载到stringlist中,并传递文本
)
使用网站提供的TPerlRegex
,您可以使用
var
Regex: TPerlRegEx;
begin
...
Regex := TPerlRegEx.Create(nil);
Regex.RegEx := 'lang\((.*)\)';
Regex.Options := [preMultiLine];
Regex.Subject := SubjectString;
if Regex.Match then
begin
repeat
// matched text: Regex.MatchedExpression;
// match start: Regex.MatchedExpressionOffset;
// match length: Regex.MatchedExpressionLength;
// backreference n text: Regex.SubExpressions[n];
// backreference n start: Regex.SubExpressionOffsets[n];
// backreference n length: Regex.SubExpressionLengths[n];
until not Regex.MatchAgain;
end;
end;
var
Regex: TRegEx;
MatchResults: TMatch;
begin
...
try
Regex := TRegEx.Create('lang\((.*)\)', [roMultiLine]);
MatchResults := Regex.Match(SubjectString);
while MatchResults.Success do begin
MatchResults := MatchResults.NextMatch();
end;
except
on E: ERegularExpressionError do
begin
// Syntax error in the regular expression
end;
end;
end;
使用Delphi XE的正则表达式支持(use regex
),您可以使用
var
Regex: TPerlRegEx;
begin
...
Regex := TPerlRegEx.Create(nil);
Regex.RegEx := 'lang\((.*)\)';
Regex.Options := [preMultiLine];
Regex.Subject := SubjectString;
if Regex.Match then
begin
repeat
// matched text: Regex.MatchedExpression;
// match start: Regex.MatchedExpressionOffset;
// match length: Regex.MatchedExpressionLength;
// backreference n text: Regex.SubExpressions[n];
// backreference n start: Regex.SubExpressionOffsets[n];
// backreference n length: Regex.SubExpressionLengths[n];
until not Regex.MatchAgain;
end;
end;
var
Regex: TRegEx;
MatchResults: TMatch;
begin
...
try
Regex := TRegEx.Create('lang\((.*)\)', [roMultiLine]);
MatchResults := Regex.Match(SubjectString);
while MatchResults.Success do begin
MatchResults := MatchResults.NextMatch();
end;
except
on E: ERegularExpressionError do
begin
// Syntax error in the regular expression
end;
end;
end;
在这两种情况下,所需的文本(括号之间的部分)将位于每个匹配的捕获组1中
我似乎还记得其他问题,您正在使用Delphi 7,因此第一个可能是最佳选择。Regexp不是独立于语言的。嗯。。。什么?在没有“loremipsum”、阴影和粗体内容的情况下再次尝试发帖,输入您用于尝试和搜索的实际文本,以及您尝试匹配的内容的示例,以及您迄今为止尝试过但不起作用的内容,也许有人可以帮上忙。现在,这只是一堆噪音。我们无法读懂你的心思来了解你想做什么;你的问题越清楚,得到答案的机会就越大。:)@我简化了这个问题。啊,明白了。你是那个坚持尝试自己编写国际化代码的人。:)您是否总是在搜索
lang
之后的内容,这些内容在括号中用引号括起来,如lang('
,后跟一些文本,直到结束)
?请记住,基于正则表达式的源代码解析有时会失败。非常感谢!我检查你的答案是否被接受,并编辑了我的问题。我的内部化代码现在完成了,我使用它生成一个字符串列表,迭代项目文件夹中的所有源代码文件。