mark.js 的非贪婪正则表达式

Non-greedy RegEx for mark.js

我刚开始使用mark.js(https://markjs.io),现在我正在尝试找到合适的正则表达式来捕获尽可能少的数据(非贪婪类型),并且没有超过一定数量的字符。

我尝试了多种选择,目前我有这三个正则表达式,但各有缺点:

  1. w(.{1,30})?3 - 捕获 'word1 word2 word3 wo rd3',而不是 'word3' 和 'wo rd3';

  2. w(\w{1,30})?3 - 按原样捕获 'word3',但因 'wo rd3';

    而失败
  3. 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>