mark.js 的非贪婪正则表达式
Non-greedy RegEx for mark.js
我刚开始使用mark.js(https://markjs.io),现在我正在尝试找到合适的正则表达式来捕获尽可能少的数据(非贪婪类型),并且没有超过一定数量的字符。
我尝试了多种选择,目前我有这三个正则表达式,但各有缺点:
w(.{1,30})?3
- 捕获 'word1 word2 word3 wo rd3',而不是 'word3' 和 'wo rd3';
w(\w{1,30})?3
- 按原样捕获 'word3',但因 'wo rd3';
而失败
w((\w| ){1,30})?3
- 这与上面的第一个选项完全一样。
为了更好的理解,请运行下面的代码。
你怎么看,我在这里错过了什么?
亚历克斯
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>
w(.{1,30})?3
- captures 'word1 word2 word3 wo rd3', instead of 'word3' and 'wo rd3';
是的,因为 .{1, 30}
意味着最多捕获 30 个 任何字符 (换行符除外)。由于第一个 w
和最后一个 3
之间只有 22 个字符,它将匹配所有内容。
w(\w{1,30})?3
- captures 'word3' as it should, but fails for 'wo rd3';
是的,因为\w
只匹配word字符,不匹配whitespace。
w((\w| ){1,30})?3
- this behaves exactly like the 1st option above.
是的,因为 (\w | )
与 .
几乎相同。 (.
也会匹配 \t
和其他种类的白色 space。)
如果你想匹配任何以 w
开始并以 3
结束的东西,中间最多有一个 space,你可以使用:
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>
我刚开始使用mark.js(https://markjs.io),现在我正在尝试找到合适的正则表达式来捕获尽可能少的数据(非贪婪类型),并且没有超过一定数量的字符。
我尝试了多种选择,目前我有这三个正则表达式,但各有缺点:
w(.{1,30})?3
- 捕获 'word1 word2 word3 wo rd3',而不是 'word3' 和 'wo rd3';
而失败w(\w{1,30})?3
- 按原样捕获 'word3',但因 'wo rd3';w((\w| ){1,30})?3
- 这与上面的第一个选项完全一样。
为了更好的理解,请运行下面的代码。
你怎么看,我在这里错过了什么?
亚历克斯
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>
w(.{1,30})?3
- captures 'word1 word2 word3 wo rd3', instead of 'word3' and 'wo rd3';
是的,因为 .{1, 30}
意味着最多捕获 30 个 任何字符 (换行符除外)。由于第一个 w
和最后一个 3
之间只有 22 个字符,它将匹配所有内容。
w(\w{1,30})?3
- captures 'word3' as it should, but fails for 'wo rd3';
是的,因为\w
只匹配word字符,不匹配whitespace。
w((\w| ){1,30})?3
- this behaves exactly like the 1st option above.
是的,因为 (\w | )
与 .
几乎相同。 (.
也会匹配 \t
和其他种类的白色 space。)
如果你想匹配任何以 w
开始并以 3
结束的东西,中间最多有一个 space,你可以使用:
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>