首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何查找字符串中是否缺少了一系列非浮点数。

如何查找字符串中是否缺少了一系列非浮点数。
EN

Stack Overflow用户
提问于 2018-08-22 01:02:45
回答 3查看 122关注 0票数 4

在巴斯,

我想在一个字符串中找到一个范围的非浮点数。

如果我有这样的绳子:

代码语言:javascript
复制
"1.4.jpg 2.005.jpg 003: Blah.jpg Blah4.jpg 4.5.jpg"

我想知道数字是否丢失了。说,如果

代码语言:javascript
复制
firstNum=1
lastNum=5

函数将返回

1人失踪,2人失踪,5人失踪

在字符串中查找非浮点数相对容易,但让我的脚本困惑的是字符串的"2.005.jpg“部分。我的脚本不知道如何识别5是浮点数2的一部分,因此应该忽略它。

我只想说这个数字是有前导零还是有“0-9”。在它面前,忽略它。但不幸的是,我需要支持的数字与任何数量的领先零。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-22 06:55:28

如果不反对使用awk,则可以使用以下脚本:

代码语言:javascript
复制
echo "1.4.jpg 2.005.jpg 003: Blah.jpg Blah4.jpg" | \
   awk -v min=1 -v max=5 -v RS="[^0-9. ]+" '
     ($0+0)!~/\./&&/[0-9]+/{a[$0+0]}
     END{for(i=min;i<=max;i++)if(!(i in a))print i " is missing"}'

这是一个GNU脚本,它依赖于记录分隔符RS将行拆分为仅(浮点数)。

诀窍是将0添加到找到的数字中,并检查它是否仍然是十进制形式(没有任何点.)。如果是这样,则将该数字存储在数组a中。

END语句循环遍历从min (1)到max (5)的所有十进制数,如果该数字不是数组a的一部分,则打印消息。

符合posix标准的替代脚本如下:

代码语言:javascript
复制
echo "1.4.jpg 2.005.jpg 003: Blah.jpg Blah4.jpg" | \
   awk -v min=1 -v max=5 '
     {
        split($0,n,"[^0-9. ]+"); 
        for(i in n){
           if((n[i]+0)!~/\./&&n[i]~/[0-9]+/){
             a[n[i]+0]
           }
        }
     }
     END{for(i=min;i<=max;i++)if(!(i in a))print i " is missing"}'

主要区别在于使用了取代split()的函数RSsplit分解输入字符串并将数字放入数组n中。然后在十进制数情况下,检查数组元素并将其放入数组a中。

票数 2
EN

Stack Overflow用户

发布于 2018-08-22 03:36:23

可能的答案:

下面是一个bash函数,它以(希望)合理的方式给出了所提供的测试用例的预期输出值:

代码语言:javascript
复制
function check_missing {
    prefix=""
    for i in {1..5}; do
        # make sure that $i is present, 
        # with optional leading zeroes,
        # but with at least one non-number
        # *before* the zeroes and *after* $i
        if ! [[ "$1" =~ .*[^0-9\.]0*"$i"\.?[^0-9\.].* ]]; then 
            echo -n "${prefix}${i} is missing"
            prefix=", "
        fi
    done
    echo
}

我不确定这将推广到其他输入(或者输出格式有多重要),但希望它至少给出了一个解决问题的方法。

示例输出:

代码语言:javascript
复制
> check_missing "001.004.jpg 2.005.jpg 003.jpg Blah4.jpg"
1 is missing, 2 is missing, 5 is missing
> check_missing "1.4.jpg 2.005.jpg 003: Blah.jpg Blah4.jpg"
1 is missing, 2 is missing, 5 is missing
票数 1
EN

Stack Overflow用户

发布于 2018-08-22 09:05:43

看看这个扩展全球模式

代码语言:javascript
复制
find_missing() {
    shopt -s extglob

    for(( i = $2; i <= $3; i++ )); do
        [[ $1 = !(*[0-9]|*[0-9].)*(0)"$i"!(.[0-9]*|[0-9]*) ]] || printf '<%s> missing!\n' "$i"
    done
}

假设$i为4:

  • "$i":匹配数字
  • "$i"!(.[0-9]*|[0-9]*):如果数字后面没有.<number>,这将使其成为浮点数(例如,4.1),则匹配该数字,或者简单地后面跟着另一个数字,使其成为不同的数字(例如,它会错误地认为414 )。
  • *(0)"$i"!(.[0-9]*|[0-9]*):允许引导0
  • !(*[0-9]|*[0-9].)*(0)"$i"!(.[0-9]*|[0-9]*):如果数字不以<number>.为前缀,则匹配它,这会使它成为浮点数(例如,1.4),或者以另一个数字作为前缀,使其成为不同的数字(例如,它会错误地认为244 )。
  • shopt -s extglob:启用扩展球状

测试运行:

代码语言:javascript
复制
$ find_missing "1.4.jpg 2.005.jpg 003: Blah.jpg Blah4.jpg" 1 5
<1> missing!
<2> missing!
<5> missing!  
$ find_missing "1.4.jpg 2.005.jpg 003: Blah.jpg Blah4.jpg" 1 2
<1> missing!
<2> missing!
$ find_missing "001 3.002 A.4A" 1 4
<2> missing!
<3> missing!
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51958579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档