Как мне управлять группировкой Regex? - PullRequest
0 голосов
/ 26 марта 2009

У меня есть текстовый файл, который содержит следующие фрагменты кода

Lines.Strings = (
  'test@test1.com'
  'test@test2.org'
  'test@test3.org'
  'test@test4.com')

адрес электронной почты изменится. как и часть Lines в Lines.String, ее можно назвать как угодно EG Test.Strings или ListBox.Strings

Я хочу сопоставить все и любой текст внутри этого блока Strings = ();

вот код, который я использую

[a-zA-Z]+\.Strings\s+=\s+[\(]{1}(.+)[\)]{1}

но не все совпадения

Я хочу, чтобы группировка прекратилась после первого). похоже, что он соответствует любому символу после первого (и до конца файла до последнего)

любая помощь будет принята с благодарностью.

EDIT

Я не прошу сопоставлять «электронные письма»; я хочу любой текст между открытием (и закрытием)

Я думаю, это называется "не жадным" соответствием. я хочу, чтобы матч заканчивался только после первого).

Ответы [ 3 ]

3 голосов
/ 26 марта 2009

Это может работать лучше.

[a-zA-Z]+\.Strings\s*=\s*\(([^)])+)\)

Кроме того, как вы справляетесь с переносами строк? Это может быть вашей проблемой. Из приведенного вами регулярного выражения выглядит так, как будто вы объединяете все строки вместе с пробелами. Если нет, вам нужно мыслить в терминах многострочных регулярных выражений.

В ответ на ваш ответ на свой вопрос:

"[a-zA-Z]+\\.Strings\\s+=\\s+[\\(]{1}(.+?)\\){1}?",

бесполезно загроможден и может не работать, как вы ожидаете, в нескольких случаях.

  • вам не нужно писать {1}, так как это значение по умолчанию
  • [\)] совпадает с \)
  • вы не будете соответствовать случаям, когда = не окружен пробелами, даже если такие пробелы обычно необязательны
  • Если сделать окончательный ) необязательным и не исключать ) из вашего внутреннего шаблона, это означает, что он будет частью вашего захвата.

Исправление этих отведений к:

"[a-zA-Z]+\\.Strings\\s*=\\s*\\(([^)]+)\\)"

Это именно то, что я написал, но с обратной косой чертой, удвоенной для использования в строке.

1 голос
/ 26 марта 2009

Попробуйте

/\(([^\)]+)\)/

NODE                     EXPLANATION
----------------------------------------------------------------------
  \(                       '('
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    [^\)]+?                  any character except: '\)' (1 or more
                             times (matching the least amount
                             possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
  \)                       ')'
----------------------------------------------------------------------
0 голосов
/ 26 марта 2009
public static Regex regex = new Regex(
      "[a-zA-Z]+\\.Strings\\s+=\\s+[\\(]{1}(.+?)\\){1}?",
    RegexOptions.IgnoreCase
    | RegexOptions.Singleline
    | RegexOptions.CultureInvariant
    | RegexOptions.IgnorePatternWhitespace
    | RegexOptions.Compiled
    );

Кажется, я понял.

Если вы можете улучшить это; оставьте свой ответ с обновленной версией.

- Примечание - вышеперечисленные работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...