【问题标题】:bash regexp for cleaning some chars用于清理一些字符的 bash 正则表达式
【发布时间】:2016-09-25 19:17:36
【问题描述】:

我有一个字符串要在 bash 中匹配和清理,例如:

POST_DATA="password=this*pass&is/for?testing"

我想匹配 = 符号清理(排除)此字符后的所有字符串 *&/?

我可以使用 = 符号之后的所有内容:

[[ ${POST_DATA} =~ ^password=(.*)$ ]] && password="${BASH_REMATCH[1]}"
echo $password

这表明:

this*pass&is/for?testing

我想要一个想要输出的正则表达式:

thispassisfortesting

我尝试了一些不能像这样工作的排除模式:

^password=(^[^\*\?&/])*$

有什么想法吗?谢谢。

【问题讨论】:

    标签: regex bash sanitize


    【解决方案1】:

    使用参数扩展而不是正则表达式:

    #!/bin/bash
    POST_DATA="password=this*pass&is/for?testing"
    after_eq=${POST_DATA#*=}             # remove everything up to the first =
    printf '%s\n' "${after_eq//[*&\/?]}" # remove all asterisks, ampersands, slashes and question marks
    

    【讨论】:

    • 也许使用printf - 如果密码以破折号开头,此代码可能会失败并显示echo
    • 我需要它使用纯 bash。这对我来说没问题。谢谢。
    • @OscarAkaElvis: printf 是一个内置的 bash。
    【解决方案2】:

    % echo "$POST_DATA" | perl -pe 's/(?:password=|[*&\/?])//g'              
    thispassisfortesting
    

    【讨论】:

      【解决方案3】:

      这里的问题是正则表达式应该匹配一些东西。你写了一个模式,它要么匹配,要么不匹配。它不应该删除东西,只是为了匹配。

      因此,您要删除一些特定字符以清理字符串,这不是正则表达式的用例。 您需要的是某种 String.replace(/[^*\?&/]/, "") ,它将从您的字符串中删除所有有问题的字符。

      假设您正在使用 PHP(基于您使用的 ${POST_DATA}),我建议在匹配 password= 之前使用:preg_replace('/[^\*\?&\/]/','',${POST_DATA}),以便删除所有违规字符。

      【讨论】:

        猜你喜欢
        • 2011-01-15
        • 1970-01-01
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-06
        • 2010-12-31
        相关资源
        最近更新 更多