我可以在 Match() 中使用 Contains()我需要搜索字符列以查看每行值是否包含特定字符串,然后在新列中相应地创建指标名称/组(它将搜索 ~14 个特定字符串)。我很确定嵌套 IF() 会很慢......过去,当我想要匹配精确的字符串时,我曾使用过 Match(),但是我可以使用通配符吗?
我尝试了 * 和 % 但无济于事:
Match( :columnOfInterest,
"*StringA*", "String A",
"*StringB*", "String B",
"" )
然后我尝试在 Match() 中使用 Contains() 但仍然没有成功:
Match( :columnOfInterest,
Contains(:columnOfInterest, "StringA"), "String A",
Contains(:columnOfInterest, "StringB"), "String B",
"" )
我看到 Contains 返回一个数字,所以我还尝试添加 > 比较,甚至包装在 NUM() 中:
Match( :columnOfInterest,
Contains(:columnOfInterest, "StringA") > 0, "String A",
Contains(:columnOfInterest, "StringB") > 0, "String B",
"" )
和
Match( :columnOfInterest,
Num(Contains(:columnOfInterest, "StringA")) > 0, "String A",
Num(Contains(:columnOfInterest, "StringB")) > 0, "String B",
"" )
任何帮助是极大的赞赏。谢谢!
回复:我可以在 Match() 中使用 Contains()这解决了我的问题。 完全忘记了关联数组。 多谢!回复:我可以在 Match() 中使用 Contains()JMP初学者

您可以使用关联数组来存储要映射到不同字符串的字符串的查找表。
例如,上面的 :searchTerms 和 :mappedTerms 就是此类关联数组的键和值。 在下面的代码中,该数组被分配给变量“lookup”。 在结果映射列的最终公式中,您将看到正则表达式找到的每个匹配项都用作查找数组的参数。
例如,取上表中的第 1 行。 找到的结果是“Integra”,映射的结果是lookup[“Accord”],即“GroupA”
fmlaExpr = Expr(
If( Row() == 1,
lookUp = Associative Array( :searchTerms, :mappedTerms, Empty() );
vals = :searchTerms << get values;
doThis = Expr(
lookUp[Regex( :ColumnOfInterest, Char( "(" || Concat Items( vals, "|" ) || ")" ) )]
);
doThis;
,
doThis
)
);
Eval( Eval Expr( :RESULTS-mapped << set formula( Expr( Parse( Char( NameExpr(fmlaExpr)) ) ) ) ) );
附件是完整的示例表。
回复:我可以在 Match() 中使用 Contains()<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />请注意,“\1”实际上并没有什么区别,因为我们只有 1 个模式。 如果有多个括号,那么确实可以有“\1”或“\n”,其中 n <= 模式数。 请参阅 JMP 在线文档 ==>常用表达
回复:我可以在 Match() 中使用 Contains()这一切都是有道理的,现在我要尝试让事情复杂化......
regex(test,"(ABC|DEF|GHI)","\1")
我可以返回与匹配的字符串不同的字符串吗?
- 如果找到“ABC”,则返回“group1”,
- 如果找到“DEF”,则返回“group2”等
或者正则表达式不可能做到这一点?
回复:我可以在 Match() 中使用 Contains()感谢 PBZ 和 Jim,Regex() 效果很好,现在我在编写脚本时有了一个可以使用的新工具!非常感激!
回复:我可以在 Match() 中使用 Contains()正则表达式就是这样做的方法,这是一个非常简单的示例,它将执行您想要的多重匹配。只需用您要查找的字符串扩展它即可。它将返回它找到的匹配项。
names default to here(1);
test="Answer is ABC";
TheMatch = regex(test,"(ABC|DEF|GHI)","\1");
回复:我可以在 Match() 中使用 Contains()JMP初学者
我会完全避免条件语句。 更好的解决方案是使用正则表达式。 例如,假设您的搜索词是汽车型号、“Accord”、“Civic”等,则可以编写正则表达式语句: “匹配任何条款” 。 在 JSL 中,列公式如下所示:
Regex( :columnOfInterest, "(Accord|Civic|Corolla|Dakota|Integra|Maxima|Ranger|S10)" );
附件是一个简单的演示文件。 正则表达式在字符串模式匹配方面非常强大。 有很多用于匹配部分单词、词干等的选项。希望这会有所帮助!
-PBZ