Нежадное RegEx для mark. js - PullRequest
       2

Нежадное RegEx для mark. js

0 голосов
/ 01 августа 2020

Я только начал использовать mark. js (https://markjs.io), и сейчас я пытаюсь найти правильный RegEx для захвата как можно меньше данных (нежадный тип), и не более определенного количества символов.

Я пробовал несколько вариантов, и пока у меня есть эти три регулярных выражения, но у каждого есть свои ошибки:

  1. w(.{1,30})?3 - захватывает 'word1 word2 word3 wo rd3' вместо 'word3' и 'wo rd3';

  2. w(\w{1,30})?3 - захватывает 'word3' как должно, но не работает for 'wo rd3';

  3. w((\w| ){1,30})?3 - это ведет себя точно так же, как и первый вариант выше.

Для лучшего понимания запустите код ниже.

Как вы думаете, чего мне здесь не хватает, пожалуйста?

Alex

var regex = /w(.{1,30})?3/i;
      // var regex = /w(\w{1,30})?3/i;
      // var regex = /w((\w| ){1,30})?3/i;

      var instance = new Mark(document.querySelector("body"));
      instance.markRegExp (regex, {
        className: "mark"
      });
.mark {
        color: white;
        background: red;
      }
<script src="https://cdn.jsdelivr.net/mark.js/8.8.3/mark.min.js"></script>


    <div>word1 word2 word3 wo rd3 word4</div>

1 Ответ

1 голос
/ 01 августа 2020

w(.{1,30})?3 - захватывает 'word1 word2 word3 wo rd3' вместо 'word3' и 'wo rd3';

Да, потому что .{1, 30} означает захват до 30 из любой символ (кроме символов новой строки). И поскольку у вас есть только 22 символа между первым w и последним 3, он будет соответствовать всему.

w(\w{1,30})?3 - захватывает 'word3', как и должно, но не для ' wo rd3 ';

Да, потому что \w соответствует только символам слова, а не пробелам.

w((\w| ){1,30})?3 - это ведет себя точно так же, как и первый вариант выше.

Да, потому что (\w | ) почти идентично .. (. также будет соответствовать \t и другим видам пробелов.)

Если вы хотите сопоставить все, что начинается с w и заканчивается 3, с не более чем одним пробелом между ними, вы можете использовать:

w\w+?(\s\w+?)?3

+? указывает на «нежадный» тип соответствия, который вы ищете. Однако это регулярное выражение также будет соответствовать word2 word3. Если что-либо, оканчивающееся на цифру, указывает на конец потенциального совпадения, вы можете вместо этого использовать:

w[a-zA-Z]+?(\s[a-zA-Z]+?)?3

И поскольку вы уже использовали флаг /i, [a-zA-Z] можно упростить до простого [a-z].

var regex = /w[a-z]+?(\s[a-z]+?)?3/ig;
var instance = new Mark(document.querySelector("body"));
instance.markRegExp (regex, {
  className: "mark"
});
.mark {
        color: white;
        background: red;
      }
<script src="https://cdn.jsdelivr.net/mark.js/8.8.3/mark.min.js"></script>

<div>word1 word2 word3 wo rd3 word4</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...