«Простое» регулярное выражение не работает так, как я хочу? - PullRequest
1 голос
/ 02 ноября 2011

То, что я пытаюсь сделать, это получить текст и URL из строки, подобной этой:

Это заголовок [http://awebsite.com/a/download.zip]

Это регулярное выражение, которое я использую:

/(.*?)[(.*?)]/

Я знаю, в чем проблема ... первый (.*?) соответствует всей строке! Но я не уверен, как сделать так, чтобы оно совпадало с первым [ вхождением.

Объяснение того, что я делаю неправильно и как исправить, было бы хорошо, спасибо. Я БУДУ в конце концов выучу регулярные выражения!

Спасибо, ребята

PS: использование php и функции preg_match.

Ответы [ 4 ]

3 голосов
/ 02 ноября 2011

Ваша проблема не в первой части, а во второй части.

Вы должны сбежать [как это:

/(.*?)\[(.*?)]/

Объяснение:

    "
(       # Match the regular expression below and capture its match into backreference number 1
   .       # Match any single character
      *?      # Between zero and unlimited times, as few times as possible, expanding as needed (lazy)
)
\[      # Match the character “[” literally
(       # Match the regular expression below and capture its match into backreference number 2
   .       # Match any single character
      *?      # Between zero and unlimited times, as few times as possible, expanding as needed (lazy)
)
]       # Match the character “]” literally
"
2 голосов
/ 02 ноября 2011

Вы почти получили его, но попробуйте экранировать символы группировки [и], и вы получите:

/(.*?)\[(.*?)\]/
2 голосов
/ 02 ноября 2011

[(.*?)] является классом символов и соответствует одному из: '(', '.', '*', '?' или ')'.

Вам нужно экранировать [, чтобы он совпадал с литералом '['] не является специальным, поэтому его не нужно экранировать).

/(.*?)\[(.*?)]/

См .: http://www.regular -expressions.info / charclass.html

1 голос
/ 02 ноября 2011

Вам нужно экранировать до [] символов:

/(.*?)\[(.*?)\]/
...