Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex是一个源代码文件_Regex_Delphi_Static Analysis - Fatal编程技术网

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('
,后跟一些文本,直到结束
?请记住,基于正则表达式的源代码解析有时会失败。非常感谢!我检查你的答案是否被接受,并编辑了我的问题。我的内部化代码现在完成了,我使用它生成一个字符串列表,迭代项目文件夹中的所有源代码文件。