请教一个正则表达式匹配问题

heflat
  • 9

想要完成一个正则匹配,结果始终匹配不上,正则如下:

(:::(ONE)(::)([a-zA-Z]+)(::)(.+?):::)(:::(AND|OR|NOT)(::)([a-zA-Z]+)(::)(.+?):::)*

我想要的结果是以 :::ONE::title::标题::: 开头,后面是多个 :::AND::title::标题:::
(开头必须有 ONE 且只出现一次,后面的 AND 可以是 OR 或者 NOT,其中 title 也可以 author 等,每一组都是 ::: 开头和结尾)

下面是我测试使用的文本内容:
:::ONE::title::标题::::::AND::author::作者::::::OR::keyword::关键词::::::NOT::year::2017:::

我自己匹配结果,只匹配了第一组和最后一组,希望大牛们帮忙写一下或提供一下思路(项目中用,网上查了很久,没找到解决方案)

这是我测试正则使用的网站:https://regex101.com

感谢!

回复
阅读 1.3k
3 个回答
✓ 已被采纳

有可能是子表达式的匹配值被重复覆盖,导致最后的值是最后的匹配结果,可以用循环匹配获取到每个值,下面是用js写
的循环匹配

 function test(str) {
            var reg = '(:{3}ONE:{2}[^:]+:{2}[^:]+:{3})\s*(?:\s*(:{3}(?:AND|OR|NOT):{2}[^:]+:{2}[^:]+:{3})\s*){1}'
            var arr = [];
            var count = 1;
            var one = str.match(reg)[1];
            var target;
            arr.push(one);
            while(target = str.match(reg)) {
                arr.push(target[2]);
                count++;
                reg = '(:{3}ONE:{2}[^:]+:{2}[^:]+:{3})\s*(?:\s*(:{3}(?:AND|OR|NOT):{2}[^:]+:{2}[^:]+:{3})\s*){' + count + '}'
            }
            return arr;
        }
        test(':::ONE::title::标题::::::AND::author::作者::::::OR::keyword::关键词::::::NOT::year::2017:::')

恕我直言,匹配貌似是成功的?匹配的时候是否选择了js作为匹配准则?

是有问题的,举其一::::ONE::title::标题::: :::AND::author::作者::: :::OR::keyword::关键词::: :::NOT::year::2017::: 之间加空格就匹配不上。

我现在准备换一个思路解决:对开头必须有 ONE 进行单独处理,正则只匹配后面的。

谢谢你的回答!

(回复 donpingpu,位置发错了)

宣传栏