Regex файл исходного кода - PullRequest
       14

Regex файл исходного кода

2 голосов
/ 27 ноября 2011

У меня есть текст, который является файлом исходного кода, мне нужно найти первый параметр всех вызовов этой функции.Это можно назвать двумя способами.Я полностью туп в регулярных выражениях.

lang('FOUND') и lang('FOUND',[loremipsum])

НАЙДЕНО должно быть что угодно, это значение, которое я ищу.

Я выполнюрегулярное выражение в delphi, но я думаю, что регулярное выражение не зависит от языкаработает отлично!

Регулярное выражение: (?:lang\s*\(\s*')(.*?)(?:'\s*\)|'\s*\,\s*\[.*\]\s*\))

Включите единицу PerlRegEx на Uses

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;

1 Ответ

2 голосов
/ 27 ноября 2011

(Весь приведенный ниже код был сгенерирован Regex Buddy ; я также использовал его для создания используемого регулярного выражения. SubjectString - это содержимое вашего исходного файла, загруженное в строку; вы можете загрузить исходный файл в список строк, например, и передать Text.)

Используя TPerlRegex, доступный на сайте RegEx Buddy , вы можете использовать

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;

Используя поддержку регулярных выражений Delphi XE (use Regex), вы можете использовать

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, поэтому первый, вероятно, будет лучшим вариантом.

...