一行正则表达式与项目数无关

时间:2019-02-01 02:53:41

标签: regex classification adobe-analytics

我可以使用单行正则表达式代码来匹配管道“ |”之间的值吗?与管道之间的项目数量无关。例如。我有以下正则表达式:

^(.*?)\|(.*?)\|(.*?)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)$

仅在我有12个项目时有效。我该如何做例如还有6个项目?

2 个答案:

答案 0 :(得分:0)

private static List<String> descriptionFormatter(String string, int amt){
    String[] splitted = string.split(" ");
    List<String> ans = new ArrayList<>();
    StringBuilder sb = new StringBuilder();
    for (String s : splitted) {
        if (sb.length() + s.length() > amt) {
            ans.add(sb.toString()); // end the line add to list
            sb.setLength(0); //clear the current string
        } else {
            if (sb.length()!=0)
                sb.append(" "); // if it's the first don't add a space
            sb.append(s); // add the word
        }
    }
    ans.add(sb.toString());// add the last line
    return ans;
}

这是我过去用于此目的的模式。它匹配一个或多个不包含管道直径的组。

答案 1 :(得分:0)

对于Adobe分类规则构建器(CRB),无法编写与任意数量的模式匹配的正则表达式并将其推入$n捕获组。大多数正则表达式引擎不允许这样做,尽管某些语言提供了某些方法来或多或少有效地将其作为返回数组或其他方式来执行。但是CRB不提供这类服务。

但是,无论如何都希望这样做几乎是没有意义的,因为上游或下游没有任何东西可以真正动态地/自动地容纳这种东西。

例如,CRB界面中没有办法用任意$1$2$3[$n..]值动态填充输出值,也没有办法在规则集中动态生成任意数量的规则。

此外,Adobe Analytics(AA)始终不提供任意的即时分类列生成功能(除非您想使用分类API编写脚本,但无论如何对于CRB都不能这样说)。

例如,如果您拥有

s.eVar1='foo1|foo2';

您要将其分类为2个分类列/报告,则必须在分类界面中创建它们。然后假设您发送的下一个值是:

s.eVar1='foo1|foo2|foo3';

AA不会自动为您创建新的分类级别;您必须进入并添加第三个,依此类推。

因此,总的来说,即使不可能在CRB中返回任意数量的捕获组$n,也确实没有必要这样做。

如果您解释一下您实际上总体上想做的事情,也许会有所帮助吗?例如,您希望看到哪些报告?

我看到这种“愿望”的一个普遍原因是,当某人想要跟踪诸如标题或面包屑导航链接之类的东西时,它们具有任意深度。因此他们推动了面包屑

Home > Electronics > Computers > Monitors > LED Monitors

...或eVar的任何内容(但根据您的问题用管道分隔),然后他们希望将其分解为分类的列。

问题是,它可能是任意长度。但是如上所述,为它们设置分类和规则并不能真正容纳这种情况。

通常,对于这种情况,最佳实践是查看原始数据,并查看平均多少层代表大量数据。例如,如果您查看原始的eVar报告,即使发现值中可以找到大约5或6个级别,但您也可以看到大多数平均值在1-3个级别之间,那么您应该创建4个分类列。前3个类别代表前3个级别,第4个类别将包含其他所有内容。

所以回到示例值:

Home|Electronics|Computers|Monitors|LED Monitors

您可以拥有:

Level1  => Home
Level2  => Electronics
Level3  => Computers
Level4+ => Monitors|LED Monitors

然后,您设置具有4条规则的CRB,每个级别一条。并且您将在所有4条规则行中使用相同的正则表达式:

^([^|]+)(?:\|([^|]+))?(?:\|([^|]+))?(?:\|(.+))?

这将返回以下捕获的组以在CRB输出中使用:

$1 => Home
$2 => Electronics
$3 => Computers
$4 => Monitors|LED Monitors

是的,这与在每种可能的长度上都有一个分类列是不同的,但是它更实用,因为在分析方面,您实际上不应一开始就过于细化。

但是,如果您绝对需要每种可能数量的定界值都包含某些内容,则需要找出最大可能值并进行大量硬编码。

或者作为分类的替代方法,请考虑以下替代方法之一:

  1. 使用列表道具
  2. 使用列表变量(例如list1)
  3. 使用商品eVar(产品变量语法)

这不是完全相同的事情,并且每个人都有自己的警告,但是您没有提供最终要从报告中获取的内容的详细信息,因此这可能会或可能不会起作用用。

无论如何,希望其中一些可以为您带来思考。