Matching optional parameters with non-capturing groups in Bash regular expression

前端 未结 2 1401
有刺的猬
有刺的猬 2021-01-18 06:04

I want to parse strings similar to the following into separate variables using regular expressions from within Bash:

Category: entity;scheme=\"http://schemas         


        
相关标签:
2条回答
  • 2021-01-18 06:30

    You can emulate non-matching groups in bash using a little bit of regexp magic:

                  _2__    _4__   _5__
    [[ "fu@k" =~ ((.+)@|)((.+)/|)(.+) ]];
    echo "${BASH_REMATCH[2]:--} ${BASH_REMATCH[4]:--} ${BASH_REMATCH[5]:--}"
    # Output: fu - k
    

    Characters @ and / are parts of string we parse. Regexp pipe | is used for either left or right (empty) part matching.

    For curious, ${VAR:-<default value>} is variable expansion with default value in case $VAR is empty.

    0 讨论(0)
  • 2021-01-18 06:32

    I don't think non-capturing groups exist in bash regex, so your options are to use a scripting language or to remove the ?: from all of the (?:...) groups and just be careful about which groups you reference, for example:

    CATEGORY_REGEX='Category:\s*([^;]*);\s*scheme="([^"]*)";\s*class="([^"]*)";\s*(title="([^"]*)";)?\s*(rel="([^"]*)";)?\s*(location="([^"]*)";)?\s*(attributes="([^"]*)";)?\s*(actions="([^"]*)";)?'
    category_string='Category: entity;scheme="http://schemas.ogf.org/occi/core#";class="kind";title="Entity";attributes="occi.core.id occi.core.title";'
    [[ $category_string =~ $CATEGORY_REGEX ]]
    echo "full:       ${BASH_REMATCH[0]}"
    echo "category:   ${BASH_REMATCH[1]}"
    echo "scheme:     ${BASH_REMATCH[2]}"
    echo "class:      ${BASH_REMATCH[3]}"
    echo "title:      ${BASH_REMATCH[5]}"
    echo "rel:        ${BASH_REMATCH[7]}"
    echo "location:   ${BASH_REMATCH[9]}"
    echo "attributes: ${BASH_REMATCH[11]}"
    echo "actions:    ${BASH_REMATCH[13]}"
    

    Note that starting with the optional parameters we need to skip a group each time, because the even numbered groups from 4 on contain the parameter name as well as the value (if the parameter is present).

    0 讨论(0)
提交回复
热议问题