Javascript Regex - | (OR) Оператор возвращает только первое совпадение [дубликат]

Вот пример использования объекта HTML5 Image, завернутого JQuery. Вызовите функцию загрузки для основного URL-адреса изображения, и если эта загрузка вызывает ошибку, замените атрибут src изображения URL-адресом резервной копии.

function loadImageUseBackupUrlOnError(imgId, primaryUrl, backupUrl) {
    var $img = $('#' + imgId);
    $(new Image()).load().error(function() {
        $img.attr('src', backupUrl);
    }).attr('src', primaryUrl)
}

<img id="myImage" src="primary-image-url"/>
<script>
    loadImageUseBackupUrlOnError('myImage','primary-image-url','backup-image-url');
</script>
3
задан Athari 2 August 2013 в 14:07
поделиться

1 ответ

Механизм регулярных выражений пытается сопоставить альтернативы в том порядке, в котором они указаны. Поэтому, когда шаблон (foo|foobar)&? сразу же foo, он продолжает поиск совпадений. Следующий бит входной строки - bar& b, который не может быть сопоставлен.

Другими словами, поскольку foo является частью foobar, нет способа (foo|foobar) когда-либо соответствовать foobar ], так как он всегда будет соответствовать foo.

Иногда это может быть очень полезным трюком. Шаблон (o|a|(\w)) позволит вам захватить \w и a или o по-другому:

Regex.Replace("a foobar& b", "(o|a|(\\w))", "$2") // fbr& b
4
ответ дан p.s.w.g 19 August 2018 в 16:17
поделиться
  • 1
    Почему не регулярное выражение жадно? Я думал, что он должен соответствовать самой длинной строке, которую он может сопоставить. – Athari 2 August 2013 в 14:13
  • 2
    @Athari жадность применяется к квантификаторам, а не к чередованиям. – p.s.w.g 2 August 2013 в 14:14
  • 3
    Есть ли способ заставить жадность к изменениям, или мне нужно сортировать изменения в обратном алфавитном порядке? – Athari 2 August 2013 в 14:16
  • 4
    @Athari Алфавитный порядок не имеет значения. Сначала чередование должно сортироваться по шаблону wideest , например. foobar шире foo, потому что любая строка, которая соответствует foo, также будет соответствовать foobar (конечно, foo(bar)? здесь более разумно). Если вы не пытаетесь использовать трюк, описанный в моем обновленном ответе. – p.s.w.g 2 August 2013 в 14:22
  • 5
    В моем реальном случае список довольно длинный, поэтому сделать регулярное выражение сложнее не стоит. Я думаю, это предложение решает мою проблему, поскольку мне нужно сопоставить отдельные слова. – Athari 2 August 2013 в 14:27
Другие вопросы по тегам:

Похожие вопросы: