Perl:在字符串中转义特殊字符以匹配正则表达式

时间:2014-10-17 15:33:30

标签: regex perl escaping special-characters

我正在编写bash函数来处理正则表达式的字符串操作。 Bash内置函数在工作中非常差,我正在使用perl命令来完成它。

例如,这是我的“strMatch”函数(在bash中):

# Usage: if (strMatch <string> <regex>); then...
function strMatch {
    local str="$1"
    local regex="$2"

    local perlCmd='if (qq('$str') =~ m/'$regex'/g) { print "0"; } else  { print "1"; }'
    return $(perl -e "$perlCmd")
}

测试字符串:foo-bar\rLoading... xx%\rFile: "some-(filename.ext".
正则表达式:-bar(?:.*?)File: "(.\*?)\.ext"

除了一件事,一切都很好;我无法找到一种方法来正确地逃避字符串中的特殊字符以匹配(至少对于其中一些字符) 我对Perl很新(除了正则表达式语法之外),所以我尝试了各种各样的东西,没有任何成功。

与'qq'它不会处理'(',它被解释为没有匹配的捕获组')'。我猜这种情况也会发生在'['...
=&GT; 语法错误在-e第1行,靠近“qq(foo-bar \ rLoading ... xx%\ rFile:”some-(filename.ext“。)= ~m / -bar \ r \ n(?:。*?)档案:“(。*?)\。ext”/ g){“
=&GT; 在-e第1行的EOF之前的任何地方找不到字符串终结符“)。

与'quotemeta'更糟糕的是,打破':','%','\ r'......几乎所有的东西
=&GT; 反斜杠发现操作员预期在-e第1行,靠近“bar”的位置 =&GT; %之前缺少运算符或分号

作为奖励,如果我添加'w'或'W'选项来获取perl警告,它不会打印任何东西!发生了什么事?

我只是希望字符串能够包含几乎所有内容,包括'%','(','[','\ r','\ n'......任何人都知道如何做到这一点???我做错了什么?

编辑:已回答

谢谢 choroba ,使用perl参数$ ARGV就像一个魅力。我还使用了 ikegami 的解决方案的修改版本,它更加优雅。

现在功能如下:

# Usage: if (strMatch <string> <regex>); then...
function strMatch {
    local str="$1"
    local regex="$2"

    local perlCmd='exit 1 if ($ARGV[0] !~ m/$ARGV[1]/g)'
    perl -e "$perlCmd" "--" "$str" "$regex"
    return $?
}

Edit2:添加“ - ”以停止处理选项。

1 个答案:

答案 0 :(得分:1)

将字符串和正则表达式作为参数传递(我还简化了Perl代码):

#!/bin/bash
# Usage: if (strMatch <string> <regex>); then...
function strMatch () {
    local str="$1"
    local regex="$2"

    local perlCmd='print $ARGV[0] =~ m/$ARGV[1]/ ? 0 : 1'
    return $(perl -e "$perlCmd" "--" "$str" "$regex")
}

使用

进行测试
~/test.sh $'foo-bar\rLoading... xx%\rFile: "some-(filename.ext"' '-bar(?:.*?)File: "(.*?).ext"'