2010-08-29 3 views
6

Это аккуратное хорошо документированное регулярное выражение, легко понимаемое, поддерживающее и модифицирующее.Как вы понимаете регулярные выражения, написанные в одной строке?

text = text.replace(/ 
    (        // Wrap whole match in $1 
     (
      ^[ \t]*>[ \t]?   // '>' at the start of a line 
      .+\n     // rest of the first line 
      (.+\n)*     // subsequent consecutive lines 
      \n*      // blanks 
     )+ 
    ) 
    /gm, 

Но как вы собираетесь работать с ними?

text = text.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm, 

Есть ли beautifier какой-то, что имеет смысл его и описывает его функциональность?

+1

Может быть, некоторые инструменты в http://stackoverflow.com/questions/32282/regex-testing-tools поможет. – kennytm

+0

Я этого не делаю. Я всегда использую 6-10 строк кода вместо explode/join/strstr/substr (PHP). Легче понять, сохранить и даже написать. – ern0

+0

Не каждый язык или библиотека, поддерживающая регулярное выражение, будет работать так же чисто, как ваш пример, из-за добавленного пробела. –

ответ

3

RegexBuddy будет «переводить» любое регулярное выражение для вас. При подаче вашего примера регулярного выражения, он выводит:

((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+) 

Options:^and $ match at line breaks 

Match the regular expression below and capture its match into backreference number 1 «((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)» 
    Match the regular expression below and capture its match into backreference number 2 «(^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+» 
     Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
     Note: You repeated the capturing group itself. The group will capture only the last iteration. 
      Put a capturing group around the repeated group to capture all iterations. «+» 
     Assert position at the beginning of a line (at beginning of the string or after a line break character) «^» 
     Match a single character present in the list below «[ \t]*» 
     Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 
     The character “ ” « » 
     A tab character «\t» 
     Match the character “>” literally «>» 
     Match a single character present in the list below «[ \t]?» 
     Between zero and one times, as many times as possible, giving back as needed (greedy) «?» 
     The character “ ” « » 
     A tab character «\t» 
     Match any single character that is not a line break character «.+» 
     Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
     Match a line feed character «\n» 
     Match the regular expression below and capture its match into backreference number 3 «(.+\n)*» 
     Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 
     Note: You repeated the capturing group itself. The group will capture only the last iteration. 
      Put a capturing group around the repeated group to capture all iterations. «*» 
     Match any single character that is not a line break character «.+» 
      Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
     Match a line feed character «\n» 
     Match a line feed character «\n*» 
     Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 

Это выглядит довольно устрашающе в текстовой форме, но это гораздо более удобные для чтения в HTML форме (который не может быть воспроизведен здесь) или в самой RegexBuddy. Он также указывает на общие ошибки (например, повторение групп захвата, которые, вероятно, не нужны здесь).

+0

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

+0

Честно говоря, я нахожу, что это тяжелое объяснение не намного понятнее, чем однострочное регулярное выражение. – kennytm

0

Через некоторое время я привык к чтению вещей. Для большинства регулярных выражений не так много, и я рекомендую сайт http://www.regular-expressions.info/, если вы хотите использовать их чаще.

5

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

+0

Yup точно так же, как любой синтаксис языка программирования, через некоторое время он становится читабельным. – Chris

0

Регулярные выражения - это всего лишь способ выразить маски и т. Д. В конце это всего лишь «язык» со своим синтаксисом.
Комментарий каждого бита вашего регулярного выражения будет таким же, как комментарий каждой строки вашего проекта.
Конечно, это поможет людям, которые не понимают ваш код, но это бесполезно, если вы (разработчик) понимаете смысл регулярного выражения.

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

Смежные вопросы