Solidity中的字符串转换为数组

3
在Solidity中,我是否可以使用分隔符将字符串文本转换为数组,并识别字符串中的复合部分?
示例:
mystring = "This-Is-A-Problem";

to

myArray = [This,Is,A,Problem];   // using hyphen as separator

值得思考的是:EVM 中的每个操作都需要消耗 gas(即代币),因此虽然这是可能的,但我不建议在 EVM 中进行此类处理以节省成本。您应该在离线状态下完成所有这些处理(例如,在将其传递给合同之前),并且仅使用合同来执行必须在区块链上完成的逻辑(例如存储值)。 - Dat Nguyen
@Dat 这归结于优先级。是多次调用 oraclize_query 并返回单个数据位的成本更高,还是在合约中进行拆分的单个调用更高。 - Marcelo Mason
3个回答

3

更新的答案,适用于最新的编译器

import "github.com/Arachnid/solidity-stringutils/strings.sol";

contract Contract {                                                            
    using strings for *;                                                       

    function smt() public pure {                                               
        strings.slice memory s = "This-Is-A-Problem".toSlice();                
        strings.slice memory delim = "-".toSlice();                            
        string[] memory parts = new string[](s.count(delim));                  
        for (uint i = 0; i < parts.length; i++) {                              
           parts[i] = s.split(delim).toString();                               
        }                                                                      
    }                                                                          
}  

https://ethfiddle.com/TgY5JxLKvn


所以,他们放弃了“var”? - PedroD
他们在Solidity 0.7.0中移除了var关键字(当前版本为0.8.9)。现在不能再使用这个关键字了。以前,这个关键字可以解析,但会导致类型错误并提出使用哪种类型的建议。现在,它会导致解析器错误。详见:https://docs.soliditylang.org/en/develop/070-breaking-changes.html?highlight=var#declarations - Harry Moreno

2

Crema的答案几乎是正确的,但请注意,对于n个部分,我们有n-1个分隔符。修改他的代码给我们:

import "github.com/Arachnid/solidity-stringutils/strings.sol";

contract Contract {
   using strings for *;

   // ...

   function smt() {
    var s = ""This-Is-A-Problem"".toSlice();
    var delim = "-".toSlice();
    var parts = new string[](s.count(delim) + 1);

    for(uint i = 0; i < parts.length; i++) {
       parts[i] = s.split(delim).toString();
    }
   }
}

2
这个字符串库无法与我的合约编译,因为我正在使用 pragma solidity ^0.6.0;。那么我就不能使用它了吗? - Sirab33

2

没有内置的方法/函数来实现这一点,但您可以使用solidity-stringutils

import "github.com/Arachnid/solidity-stringutils/strings.sol";

contract Contract {
    using strings for *;

    // ...

    function smt() {
        var s = ""This-Is-A-Problem"".toSlice();
        var delim = "-".toSlice();
        var parts = new string[](s.count(delim));
        for(uint i = 0; i < parts.length; i++) {
           parts[i] = s.split(delim).toString();
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接