Совпадение первого числа / слова / строки в кавычках во входных данных - Regex Help - PullRequest
0 голосов
/ 21 января 2010

Я хочу сопоставить первое число / слово / строку в кавычках / списке на входе с Regex.Например, он должен соответствовать тем:

"привет мир" gdfigjfoj sogjds

-14.5 fdhdfdfidfjgdlf

test14 hfghdf hjgfjd

(a (cb 7)) (3 4) "привет"

Любые идеи для регулярных выражений или как я могу начать?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 21 января 2010

Если вы хотите соответствовать сбалансированным скобкам, регулярное выражение не является подходящим инструментом для работы. Некоторые реализации регулярных выражений облегчают рекурсивное сопоставление с образцом (PHP и Perl, о которых я знаю), но AFAIK, C # не может этого сделать ( EDIT : см. Комментарий Стива ниже: ).

С помощью регулярных выражений вы можете сопоставить до определенной глубины, но это очень быстро взрывается у вас на лице. Например, это:

\(([^()]|\([^()]*\))*\)

смысл

\(                        # match the character '('
(                         # start capture group 1
  [^()]                   #   match any character from the set {'0x00'..''', '*'..'ÿ'}
  |                       #   OR
  \(                      #   match the character '('
  [^()]*                  #   match any character from the set {'0x00'..''', '*'..'ÿ'} and repeat it zero or more times
  \)                      #   match the character ')'
)*                        # end capture group 1 and repeat it zero or more times
\)                        # match the character ')'

будет соответствовать одиночным вложенным скобкам, таким как (a (c b 7)) и (a (x) b (y) c (z) d), но не будет соответствовать (a(b(c))).

2 голосов
/ 21 января 2010

Любые идеи для регулярных выражений или как я могу начать?

Вы можете начать с любого учебника по основному регулярному выражению, такого как this .


[Редактировать] Я пропустил, что вы хотели посчитать скобки. Это невозможно сделать в регулярных выражениях - ничто, кроме подсчета (кроме нестандартных запросов), не может.

0 голосов
/ 21 января 2010

Для первых трех случаев вы можете использовать:

^("[^"]*"|[+-]?\d*(?:\.\d+)?|\w+)

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

РЕДАКТИРОВАТЬ: с использованием предложенного сбалансированного соответствия для последнего:

^\([^()]*(((?<Open>\()[^()]*)+((?<Close-Open>\))[^()]*)+)*(?(Open)(?!))\)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...