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>