gpt4 book ai didi

regex - 将可选参数与 Bash 正则表达式中的非捕获组匹配

转载 作者:行者123 更新时间:2023-11-29 09:00:00 25 4
gpt4 key购买 nike

我想使用 Bash 中的正则表达式将类似于以下内容的字符串解析为单独的变量:

Category: entity;scheme="http://schemas.ogf.org/occi/core#";class="kind";title="Entity";attributes="occi.core.id occi.core.title";

Category: resource;scheme="http://schemas.ogf.org/occi/core#";class="kind";title="Resource";rel="http://schemas.ogf.org/occi/core#entity";attributes="occi.core.summary";

“title”之前的第一部分是所有字符串通用的,title 和 attributes 部分是可选的。

我设法提取了所有字符串共有的强制参数,但我遇到了不一定对所有字符串都存在的可选参数的问题。据我所知,Bash 不支持我将用于此目的的非捕获括号。

这是我到目前为止取得的成就:

CATEGORY_REGEX='Category:\s*([^;]*);scheme="([^"]*)";class="([^"]*)";'
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 ${BASH_REMATCH[0]}
echo ${BASH_REMATCH[1]}
echo ${BASH_REMATCH[2]}
echo ${BASH_REMATCH[3]}

我想使用的正则表达式(在 Ruby 中对我有用)是:

CATEGORY_REGEX='Category:\s*([^;]*);\s*scheme="([^"]*)";\s*class="([^"]*)";\s*(?:title="([^"]*)";)?\s*(?:rel="([^"]*)";)?\s*(?:location="([^"]*)";)?\s*(?:attributes="([^"]*)";)?\s*(?:actions="([^"]*)";)?'

是否有任何其他解决方案可以使用命令行工具解析字符串而不必求助于 perl、python 或 ruby​​?

最佳答案

我认为 bash 正则表达式中不存在非捕获组,因此您的选择是使用脚本语言或从所有 (?:. ..) 组并注意您引用的组,例如:

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]}"

请注意,从可选参数开始,我们每次都需要跳过一组,因为从 4 开始的偶数组包含参数名称和值(如果参数存在)。

关于regex - 将可选参数与 Bash 正则表达式中的非捕获组匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8718851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com