加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

regex – Bash正则表达式中的可选参数

发布时间:2020-12-15 21:53:34 所属栏目:安全 来源:网络整理
导读:我想使用 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:/
我想使用 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”之前的第一部分对所有字符串都是通用的,部分标题和属性是可选的.

我设法提取了所有字符串共有的强制参数,但是我对所有字符串不一定存在的可选参数有困难.据我所知,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 on的偶数编号组包含参数名称和值(如果参数存在).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读