上一节我们学会了如何自己动手“砍掉”字符串多余的前缀。有前就有后,这次我们来解决另一个常见的文本清理需求:如何移除字符串末尾的后缀。
比如,很多期货品种的描述都带有Futures
或Perpetual 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("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”结尾,那么修改后的描述就会将这些后缀移除:
总结
总结一下,通过与StrRemovePrefix
几乎相同的思路,我们成功打造了另一个强大的文本清理工具StrRemoveSuffix()
。
- 它能帮你精准地移除字符串末尾的特定文本,并且能智能地处理大小写问题。
- 当原始字符串不含指定后缀时,它会安全地返回原始字符串,不会产生错误。
- 至此,我们已经拥有了一套完整的、能智能处理大小写的“前后缀清理”解决方案。这个过程再次证明,通过巧妙组合PineScript的基础函数,我们可以创造出满足任何特定需求的自定义工具,这是从新手走向高手的关键一步。
评论前必须登录!
立即登录 注册