【问题标题】:Non-greedy RegEx for mark.jsmark.js 的非贪婪正则表达式
【发布时间】:2020-08-01 07:27:59
【问题描述】:

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

我尝试了多个选项,到目前为止我有这三个正则表达式,但每个都有自己的错误:

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

  2. w(\w{1,30})?3 - 按应有的方式捕获“word3”,但无法捕获“word3”;

  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>

【问题讨论】:

    标签: regex mark.js


    【解决方案1】:

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

    是的,因为.{1, 30} 表示最多可捕获 30 个任意字符(换行符除外)。由于第一个 w 和最后一个 3 之间只有 22 个字符,因此它将匹配所有内容。

    w(\w{1,30})?3 - 应捕获“word3”,但无法捕获“word3”;

    是的,因为\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>

    【讨论】:

    • 为了简化事情,我正在寻找这个正则表达式:'start_keyword(任何字符,但不超过 30,非贪婪)end_keyword'。开始/结束关键字通常是常规词,尽管它们也可能包含非字母数字字符。举个具体的例子,假设我有两句话:1)“这些花很漂亮”,2)“这些花很漂亮”。在这种情况下,我想将这两个句子与单个正则表达式匹配,例如“花(非贪婪正则表达式以捕获少于 30 个字符)美丽”。
    • 在那种情况下,简单的flowers.{1,30}?beautiful怎么样?这是您的第一个建议,不带括号会导致延迟匹配。
    • 哦,现在一切都清楚了!我的印象是.{1,30}? 不是非贪婪的,但我缺少的是第一个 w 和最后一个 3 之间只有 22 个字符的事实(我现在指的是我的初始示例)。您在最初的回答中向我指出了这一点,但我没有很快意识到这是我遗漏的主要内容。现在一切都清楚了,非常感谢你。很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2011-04-27
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多