当前位置:  技术问答>linux和unix

有关字符串分割的问题

    来源: 互联网  发布时间:2017-03-01

    本文导语:  假设有如此字符串: aa=11|bb=22|cc=33|dd=44 如果我想得到的结果为: 11,22,33,44 该如何处理,谢谢 | /////////////////////////////////////////////// Spliter ////////////////////////////////////////////// /**  * This class used to split...

假设有如此字符串:
aa=11|bb=22|cc=33|dd=44
如果我想得到的结果为:
11,22,33,44
该如何处理,谢谢

|

/////////////////////////////////////////////// Spliter //////////////////////////////////////////////
/**
 * This class used to split string according to the delimiter.The string which wanted to be splited shall
 * not be changed after splited.
 */
class CSpliter
{
public:
    CSpliter(void);
    /**
     * CSpliter object constructor.
     * @param [in]    apcDelimiter        a pointer pointed to the string which used as delimiter.
     * @param [in]    abIsSkipBlankField  a flag specifies if the null character shall save.
     */
    CSpliter( char const* apcDelimiter, bool abIsSkipBlankField = true );

    /**
     * This function used to specify the delimiter.
     * @param [in]    apcDelimiter        a pointer pointed to the string which used as delimiter.
     * @param [in]    abIsSkipBlankField  a flag specifies if the null character shall save.
     */
    void Delimiter ( char const* apcDelimiter, bool abIsSkipBlankField = true );

    /**
     * This function used to set the preserve area.The area shall identify by the begin and end character.
     * @param [in]    acStart    specifies the start character of the preserve area.
     * @param [in]    acStop     specifies the end character of the preserve area.
     * @param [in]    abIsStrip  specifies if the area's edge shall remain or not.
     * @retval 0    successful.
     */
    apl_int_t Preserve( char acStart, char acStop, bool abIsStrip = true );

    ~CSpliter(void);

    /**
     * This function shall split the string pointed by apcInput.
     * @param [in]    apcInput    a pointer pointed to the string which wanted to be splited.
     * @retval >=0    This value specifies the number of parts the string splited.
     */
    apl_ssize_t Parse( char const* apcInput );

    /**
     * Overloaded function.
     * @param [in]    aoInput   the string which wanted to be splited.
     * @retval >=0    This value specifies the number of parts the string splited.
     */
    apl_ssize_t Parse( std::string const& aoInput );

    /**
     * This function shall get the number of parts the string which is the first argment of the function Parse() splited.
     * @retval >=0     This value specifies the number of parts the string is splited.
     */
    apl_size_t GetSize(void) const;

    /**
     * This function shall get the specific part of the string which has been splited.
     * @param [in]    aiN    specifies the location of the substrig which wanted to be got.
     * @retval null    Get substring fail.
     * @retval >0      Get substring successfully, the return value is a pointer pointed to the substring.
     */
    char const* GetField( apl_size_t aiN );

protected:
    bool IsDelimiter( char const* apcInput ) const;

    bool IsPreserve( char acStart, char& acStop, bool& abIsStrip ) const;

    void GetToken( apl_size_t aiFieldID, char const* apcFirst, apl_size_t aiLen );

    CSpliter& operator = ( CSpliter const& );

    CSpliter( CSpliter const& );

private:
    struct CPreserve
    {
        char mcStart;
        char mcStop;
        bool mbIsStrip;
    };

    std::string moDelimiter;

    bool mbIsSkipBlankField;

    std::vector moPreserves;

    std::vector moFields;
    apl_size_t muFieldCount;
};


////////////////////////////////////////////////////////////////////////////////////////////
CSpliter::CSpliter(void)
    : mbIsSkipBlankField(false)
    , moFields(100)
    , muFieldCount(0)
{
}

CSpliter::CSpliter( char const* apcDelimiter, bool abIsSkipBlankField )
    : mbIsSkipBlankField(false)
    , moFields(100)
    , muFieldCount(0)
{
    this->Delimiter(apcDelimiter, abIsSkipBlankField);
}

CSpliter::~CSpliter(void)
{
}

void CSpliter::Delimiter( char const* apcDelimiter, bool abIsSkipBlankField )
{
    this->moDelimiter = apcDelimiter;

    this->mbIsSkipBlankField = abIsSkipBlankField ;
}

apl_int_t CSpliter::Preserve( char acStart, char acStop, bool abIsStrip )
{
    CPreserve loPreserve;

    loPreserve.mcStart = acStart;
    loPreserve.mcStop = acStop;
    loPreserve.mbIsStrip = abIsStrip;

    this->moPreserves.push_back(loPreserve);

    return 0;
}

apl_ssize_t CSpliter::Parse( char const* apcInput )
{
    char        lcStop = 0;
    bool        lbIsStrip = false;
    bool        lbIsDualDelimiter = false;
    char const* lpcFirst = apcInput;
    char const* lpcLast  = lpcFirst;

    this->muFieldCount = 0;

    while (*lpcLast != '')
    {
        if ( this->IsDelimiter(lpcLast) )
        {
            if (lpcLast == lpcFirst)
            {
                if (!this->mbIsSkipBlankField && lbIsDualDelimiter)
                {
                    this->GetToken(this->muFieldCount++, lpcFirst, lpcLast - lpcFirst);
                }

                //Skip delimiter
                lpcLast += this->moDelimiter.length();
                lpcFirst += this->moDelimiter.length();
            }
            else
            {
                //Get token
                this->GetToken(this->muFieldCount++, lpcFirst, lpcLast - lpcFirst);
                lpcFirst = lpcLast + this->moDelimiter.length();
                lpcLast = lpcFirst;
            }

            lbIsDualDelimiter = true;

            continue;
        }
        else if ( this->IsPreserve(*lpcLast, lcStop, lbIsStrip) )
        {
            lbIsDualDelimiter = false;

            if (lpcLast != lpcFirst)
            {
                //Get last token
                this->GetToken(this->muFieldCount++, lpcFirst, lpcLast - lpcFirst);
                lpcFirst = lpcLast;
            }

            while( *(++lpcLast) != '' && *lpcLast != lcStop ) {};

            if ( *lpcLast == '')
            {
                if (lbIsStrip)
                {
                    ++lpcFirst;
                }

                continue;
            }

            if (lbIsStrip)
            {
                ++lpcFirst;

                //Get last token
                this->GetToken(this->muFieldCount++, lpcFirst, lpcLast - lpcFirst);
                lpcFirst = lpcLast + 1;
                lpcLast = lpcFirst;
            }
            else
            {
                //Get last token
                this->GetToken(this->muFieldCount++, lpcFirst, lpcLast - lpcFirst + 1);
                lpcFirst = lpcLast + 1;
                lpcLast = lpcFirst;
            }

            continue;
        }

        lbIsDualDelimiter = false;
        lpcLast++;
    }

    if (lpcLast != lpcFirst)
    {
        //Get last token
        this->GetToken(this->muFieldCount++, lpcFirst, lpcLast - lpcFirst);
    }

    return this->muFieldCount;
}

apl_ssize_t CSpliter::Parse( std::string const& aoStr )
{
    return this->Parse( aoStr.c_str() );
}

bool CSpliter::IsDelimiter( char const* apcInput ) const
{
    if (this->moDelimiter.length() > 1)
    {
        return apl_strncmp( apcInput, this->moDelimiter.c_str(), this->moDelimiter.length() ) == 0 ? true : false;
    }
    else
    {
        return apcInput[0] == this->moDelimiter[0] ? true : false;
    }
}

bool CSpliter::IsPreserve( char acStart, char& acStop, bool& abIsStrip ) const
{
    for ( apl_size_t liN = 0; liN moPreserves.size(); liN++ )
    {
        if (this->moPreserves[liN].mcStart == acStart)
        {
            acStop = this->moPreserves[liN].mcStop;
            abIsStrip = this->moPreserves[liN].mbIsStrip;
            return true;
        }
    }

    return false;
}

void CSpliter::GetToken( apl_size_t aiFieldID, char const* apcFirst, apl_size_t aiLen )
{
    if ( aiFieldID >= this->moFields.size() )
    {
        this->moFields.resize(aiFieldID * 2);
    }

    this->moFields[aiFieldID].assign(apcFirst, aiLen);
}


apl_size_t CSpliter::GetSize() const
{
    return this->muFieldCount;
}

char const* CSpliter::GetField( apl_size_t aiN )
{
    return aiN moFields.size() ? this->moFields[aiN].c_str() : NULL;
}

//////////////////////////////////////////////////////////////////////////////////////////////


仅供参考!

|
 echo $A|sed -e s/[a-z=]//g -e s/|/,/g

|
#/bin/bash
result=""

str="aa=11|bb=22|cc=33|dd=44"

strs=$(echo ${str} | sed s/|/ /g)

for res in ${strs}
do
    ult=$(echo ${res} | awk -F '=' '{print $2}')
    if [ "${result}" ]
    then
        result=${result},${ult}
    else
        result=${ult}
    fi
done

echo ${result}

|
shell的话

 echo ${aa} | sed s/|/,/g


|
[nicenight@CSDN ~]$ a="aa=11|bb=22|cc=33|dd=44"
[nicenight@CSDN ~]$ echo $a
aa=11|bb=22|cc=33|dd=44
[nicenight@CSDN ~]$ echo ${a//[a-z=]/} | tr "|" ","
11,22,33,44

|
$ echo "aa=11|bb=22|cc=33|dd=44"|awk -F'[^0-9]+' '{print $2","$3","$4","$5}'
11,22,33,44

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 有关字符乱码的问题!!
  • 有关转义字符
  • 会gtk的进来看看,有关字符转换的
  • **********菜鸟送分了,有关中文字符的问题,大家在线接分了!!
  • linux内核怎么定义汇编全局变量及在c文件中使用这个变量?有关0。11下的字符回显
  • 有关ldd中字符驱动程序的scull_devices
  • 有关字符数据写入文件的问题
  • 请教高手,有关字符设备驱动程序问题
  • 有关JAVA字符集的详细系统资料哪位兄弟或MM有啊!好着急呀!遇到了问题。
  • 有关字符的问题---100分求解,在线等待
  • ​有关Docker的八个令人难以置信的事实
  • 有关内码转换(跟HttpServletRequest有关)
  • 求有关png图像处理的libpng库的有关中文资料
  • 大家推荐一下有关LINUX7有关的网络编程的书。最好是比较全面的!比较经典的。
  • 求教有关smartupload的问题,有关就给分!!
  • 有关KDevelop-3.0.4-0.1.i386.rpm的有关软件包
  • 有关在sco unix5.0.4下有关网卡设置的问题(非常急,高分相送)
  • 有关snmp的一个很菜,但是困扰了我很久的问题,有关工作原理的,望大家赐教
  • 有关KDevelop编程的资料
  • 有关集群与数据同步
  • 请教有关英文简历方面的词句!
  • 有关报表打印(在JAVA,WEB下应用)急用!
  • 请各位大哥告知JAVA中消息机制的有关资料,拜托!
  • 有关cocoon的问题??
  • 有关jbuilder
  • 我想看看有关Linux和Unix的源码,有什么好的建议
  • 有关J2ME的帮助文档!
  • 在哪里可以弄到有关tomcat配置方面的资料?
  • Helper! 有关Jbuilder使用问题???
  • 有关swing的问题,请高手回答
  • 请问哪里有jboss有关配置的教程,最好是中文的,先谢了


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3