Почему этот RegEx работает так, как я хочу? - PullRequest
4 голосов
/ 04 ноября 2008

У меня есть RegEx, который работает для меня, но я не знаю, ПОЧЕМУ он работает для меня. Я объясню.

RegEx: \s*<in.*="(<?.*?>)"\s*/>\s*


Текст, который он находит (он находит пробел до и после тега ввода):

<td class="style9">
      <input name="guarantor4" id="guarantor4" size="50" type="text" tabindex="10" value="<?php echo $data[guarantor4]; ?>"  />    </td>
</tr>


Часть, которую я не понимаю:

<in.*=" <--- As I understand it, this should only find up to the first =" as in it should only find <input name="

It actually finds: <input name="guarantor4" id="guarantor4" size="50" type="text" tabindex="10" value=" which happened to be what I was trying to do.

Что я не понимаю об этом RegEx?

Ответы [ 4 ]

8 голосов
/ 04 ноября 2008

Вы используете «жадное» соответствие.

Жадное совпадение говорит: "Ешь как можно больше, чтобы сделать эту работу"

попробуйте с

<in[^=]*=  

для начинающих, что остановит его совпадение с "=" как частью ". *"

но в будущем вы можете прочитать о

.*?  

и

.+?

нотация, которая останавливается на первом возможном условии, которое совпадает с последним.

Использование синтаксиса «без жадности» было бы лучше, если бы вы пытались остановиться, только когда увидели ДВА символов,

то есть:

<in.*?=id

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

7 голосов
/ 04 ноября 2008

.* жадный. Вы хотите, чтобы .*? нашел только первое =.

4 голосов
/ 04 ноября 2008

. * Жадный, так что он будет до последнего =. Если вы хотите, чтобы это было не жадным, добавьте знак вопроса, например, так:. *?

2 голосов
/ 04 ноября 2008

Как я понимаю, это должно только найди до первого = "как в нем должен только найти

Вы не говорите, на каком языке пишете, но почти все системы регулярных выражений являются «жадными сопоставителями», то есть они соответствуют максимально длинной подстроке ввода. В вашем случае это означает все, начиная от начала входного тега до последней последовательности одинаковых кавычек.

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

В качестве отступления, не думайте, что первый параметр будет name =, если у вас нет полного контроля над конструкцией ввода. И HTML, и XML позволяют указывать атрибуты в любом порядке.

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