保持敬畏之心
交易是一场持久战

Pine Script(26):如何从字符串中删除结尾(后缀)

#Pine Script入门教学

上一节我们学会了如何自己动手“砍掉”字符串多余的前缀。有前就有后,这次我们来解决另一个常见的文本清理需求:如何移除字符串末尾的后缀。

比如,很多期货品种的描述都带有FuturesPerpetual Futures这样的后缀,我们可能只想保留核心的品种名称。同样,PineScript没有提供现成的函数,所以我们继续发扬“自己动手,丰衣足食”的精神,来打造一个我们自己的后缀移除工具。

自定义移除后缀的StrRemoveSuffix()函数

下面这个自定义函数,能够从一个字符串的末尾移除指定的文本,并且可以选择是否忽略大小写。

// StrRemoveSuffix() 函数:移除字符串的后缀
StrRemoveSuffix(string source, string suffix, simple bool ignoreCase = false) =>
     // 步骤1: 根据ignoreCase参数,决定是否转为小写
     sourceStr = ignoreCase ? str.lower(source) : source
     suffixStr = ignoreCase ? str.lower(suffix) : suffix

     // 步骤2: 检查后缀结尾
     result = if str.endswith(sourceStr, suffixStr)
         // str.substring(source, 0, str.length(source) - str.length(suffix)) 的意思是:
         // 从原始字符串的第 0 个字符开始,一直截取到 “总长度 - 后缀长度” 的位置
          str.substring(source, 0, str.length(source) - str.length(suffix))
     else
          source
    result

这个函数的核心逻辑与我们上一节课做的前缀移除函数非常相似。唯一的关键区别在于str.substring()的用法。为了从末尾“切掉”一部分,我们告诉substring函数:从字符串的第一个字符(索引为0)开始截取,一直截取到“原始字符串总长度减去后缀长度”的那个位置为止,从而完美地保留了除了后缀以外的所有内容。

这个函数的用法示例及其结果如下:

代码示例 结果
StrRemoveSuffix("EURUSD", "USD") "EUR"。“USD”后缀与源字符串的末尾匹配。所以函数将其移除,剩下“EUR”。
StrRemoveSuffix("EURUSD", "usd") "EURUSD"。“usd”的大小写与源字符串末尾的“USD”不匹配。没有移除任何内容,返回原始字符串。
StrRemoveSuffix("EURUSD", "usd", false) "EURUSD"。函数的第三个参数默认就是false。这个“忽略大小写”选项设置为false,不会改变函数原本的返回结果。
StrRemoveSuffix("EURUSD", "usd", true) "EUR"。当ignoreCase设置为true时,两个字符串之间的大小写差异就无关紧要了。现在小写的“usd”足以从字符串末尾移除大写的“USD”。

注意事项

  • 这个函数可以处理任何返回字符串的地方,包括内置变量、自定义变量、函数返回值等。
  • 函数返回的是一个新的、被修改过的字符串副本,它不会改变你传入的原始变量的值。
  • 要移除的后缀必须和字符串末尾完全一样,包括空格。StrRemoveSuffix("EURGBP ", "GBP")就不会成功,因为source字符串的末尾多了一个空格。
  • 当你要移除的后缀suffix是空字符串""na时,函数不会做任何操作,直接返回原始字符串。

实战案例:清理品种描述以获得更简洁的标签

下面的指标会查找交易品种的描述。当这段描述以“future”或“futures”结尾时(这在期货品种中很常见),脚本会通过我们自制的StrRemoveSuffix()函数来“清理”这段描述,然后把原始描述和清理后的描述都显示在标签里,方便我们对比。

//@version=6
indicator(title="移除字符串后缀 - 案例", overlay=true)

// --- 自定义函数 ---
StrRemoveSuffix(string source, string suffix, simple bool ignoreCase = false) =>
    sourceStr = ignoreCase ? str.lower(source) : source
    suffixStr = ignoreCase ? str.lower(suffix) : suffix
    result = if str.endswith(sourceStr, suffixStr)
        str.substring(source, 0, str.length(source) - str.length(suffix))
    else
        source
    result

// --- 主逻辑 ---
// 1. 调用我们的函数来"清洗"品种描述,这里需要处理两种可能的后缀
// 第一次清洗:移除"futures"后缀 (不区分大小写)
descriptionClean = StrRemoveSuffix(syminfo.description, "futures", true)

// 第二次清洗:在上一次清洗结果的基础上,再移除"future"后缀
// 使用":="对变量进行二次赋值
descriptionClean := StrRemoveSuffix(descriptionClean, "future", true)

// 2. 显示原始描述和清洗后的描述,以作对比
if barstate.islastconfirmedhistory
    label.new(bar_index, high,
      text="原始描述:\n" + syminfo.description + 
      "\n\n移除'future(s)'后缀后:\n" + descriptionClean,
      color=color.navy, textcolor=color.white)

这个例子展示了一个非常实用的技巧:链式调用。因为有的品种描述是复数futures,有的是单数future,我们通过连续调用两次StrRemoveSuffix()函数,确保两种情况都能被清理干净。

在图表上,这个标签会显示当前图表交易品种的描述。如果该描述以“futures”或“future”结尾,那么修改后的描述就会将这些后缀移除:

使用自定义Pine脚本函数移除期货品种描述后缀的效果图

总结

总结一下,通过与StrRemovePrefix几乎相同的思路,我们成功打造了另一个强大的文本清理工具StrRemoveSuffix()

  • 它能帮你精准地移除字符串末尾的特定文本,并且能智能地处理大小写问题。
  • 当原始字符串不含指定后缀时,它会安全地返回原始字符串,不会产生错误。
  • 至此,我们已经拥有了一套完整的、能智能处理大小写的“前后缀清理”解决方案。这个过程再次证明,通过巧妙组合PineScript的基础函数,我们可以创造出满足任何特定需求的自定义工具,这是从新手走向高手的关键一步。
赞(0)
未经允许不得转载:图道交易 » Pine Script(26):如何从字符串中删除结尾(后缀)
分享到

评论 抢沙发

评论前必须登录!

立即登录   注册

登录

找回密码

注册