3

我有一列名称,例如:

  • 夸利亚,彼得罗·保罗
  • 伯纳德,克莱尔沃,圣,或
  • .E.,卡尔文 F.
  • Swingle, M Abate, 阿戈斯蒂诺, Assereto
  • 阿巴蒂,安东尼奥
  • 10-NA)\u, Ferraro, Giuseppe, ed, Biblioteca comunale ariostea。女士。(埃斯特里

我想用 openrefine 制作一个自定义文本方面,用一个逗号将名称标记为“真”,而其他所有名称都标记为“假”,这样我就可以使用最后一个(“.E.,Calvin F.”不是问题,我稍后会处理)。

我正在尝试使用“自定义文本方面”和这个表达式:

if(value.match(/([^,]+),([^,]+)/), "true", "false")

但结果全是假的。什么是错误的部分?

4

3 回答 3

2

您正在使用的表达式:

if(value.match(/([^,]+),([^,]+)/), "true", "false")

将始终评估为 false,因为“匹配”函数的输出是数组或 null。当由“if”评估时,数组和“null”都不会评估为真。

您可以将 match 函数包装在“isNonBlank”或类似函数中以获得布尔值 true/false,这将导致“if”函数按您的意愿工作。然而,一旦你有一个布尔真/假结果,'if'就变得多余了,因为它的唯一功能是将布尔真/假转换为字符串“真”或“假”——这不会对值函数产生任何影响的自定义文本方面。

所以:

isNonBlank(value.match(/([^,]+),([^,]+)/))

应该使用 match 给你想要的结果

于 2016-02-18T09:50:05.640 回答
1

您可以使用 'split' 将字符串拆分为数组,而不是使用 'match',使用逗号作为拆分字符。如果您测量结果数组的长度,它将为您提供字符串中的逗号数(即逗号数 = 长度-1)。

因此,您的自定义文本构面表达式变为:

value.split(",").length()==2

这会给你真/假

如果您想根据出现的逗号数量分解数据,您可以省略 '==2' 以获得一个只为您提供结果数组长度的方面。

于 2016-02-17T13:09:02.003 回答
0

我会使用前瞻断言来检查是否只有 1 个 "," 可以从行首到行尾找到。

^(?=[^\,]+,[^\,]+$).* https://regex101.com/r/iG4hX6/2

于 2016-02-17T11:14:34.247 回答