Как создать строку для соответствия регулярному выражению? - PullRequest
5 голосов
/ 07 марта 2012

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

'{\[((?:\#|/)[^ ]*) ([^]]*)\]}'

Может кто-нибудь создать пример, который бы соответствовал этому, и, возможно, объяснить, как он получил это. Я застрял на «?».

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

Спасибо

Ответы [ 3 ]

3 голосов
/ 07 марта 2012

См. Альтернативные варианты RegexBuddy с открытым исходным кодом и Онлайн-тестирование регулярных выражений для получения некоторых полезных инструментов Легче всего сначала объяснить им регулярное выражение. Я использовал YAPE здесь:

NODE                     EXPLANATION
----------------------------------------------------------------------
  \[                       '['
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    (?:                      group, but do not capture:
----------------------------------------------------------------------
      \#                       '#'
----------------------------------------------------------------------
     |                        OR
----------------------------------------------------------------------
      /                        '/'
----------------------------------------------------------------------
    )                        end of grouping
----------------------------------------------------------------------
    [^ ]*                    any character except: ' ' (0 or more
                             times (matching the most amount
                             possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
                           ' '
----------------------------------------------------------------------
  (                        group and capture to \2:
----------------------------------------------------------------------
    [^]]*                    any character except: ']' (0 or more
                             times (matching the most amount
                             possible))
----------------------------------------------------------------------
  )                        end of \2
----------------------------------------------------------------------
  \]                       ']'
----------------------------------------------------------------------

Это при условии, что { и } в вашем примере являются разделителями регулярных выражений .

Вы можете просто прочитать список объяснений и найти возможную строку источника, такую ​​как:

 [#NOSPACE NOBRACKET]
3 голосов
/ 07 марта 2012

(?:...) имеет тот же групповой эффект, что и (...), но без "захвата" содержимого группы; см http://php.net/manual/en/regexp.reference.subpatterns.php.

Итак, (?:\#|/) означает «либо #, либо /».

Я предполагаю, что вы знаете, что [^ ]* означает "ноль или более символов, которые не являются символами SP", и что [^]]* означает "ноль или более символов, которые не являются правыми квадратными скобками".

Если сложить все вместе, одна из возможных строк будет такой:

'{[/abcd asdfasefasdc]}'
1 голос
/ 07 марта 2012

Я думаю, что это хороший пост, чтобы помочь в разработке регулярных выражений.Хотя довольно просто написать
общее регулярное выражение для соответствия строке, иногда полезно посмотреть на него в обратном порядке после
его разработки.Иногда необходимо посмотреть, какие вещи bizzar будут совпадать.

При смешивании большого количества метачаров в качестве литералов довольно важно форматировать
такого рода для удобства чтения и во избежание ошибок.

Вот несколько примеров в Perl, которые было проще (для меня) создать прототип.

my @samps = (
 '{[/abcd asdfasefasdc]}',
 '{[# ]}',
 '{[# /# \/]}',
 '{[/#  {[
    | /# {[#\/} ]}',
,
);

for (@samps) {
   if (m~{\[([#/][^ ]*) ([^]]*)\]}~)
   {
      print "Found: '$&'\ngrp1 = '$1'\ngrp2 = '$2'\n===========\n\n";
   }
}

__END__

Expanded

\{\[ 
  (
     [#/][^ ]*
  )
  [ ]
  (
     [^\]]*
  )
\]\}

Вывод

Found: '{[/abcd asdfasefasdc]}'
grp1 = '/abcd'
grp2 = 'asdfasefasdc'
===========

Found: '{[# ]}'
grp1 = '#'
grp2 = ''
===========

Found: '{[# /# \/]}'
grp1 = '#'
grp2 = '/# \/'
===========

Found: '{[/#    {[
        | /# {[#\/}     ]}'
grp1 = '/#      {[
        |'
grp2 = '/# {[#\/}       '
===========
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...