Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl:在字符串中转义特殊字符以匹配正则表达式_Regex_Perl_Escaping_Special Characters - Fatal编程技术网

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

Regex Perl:在字符串中转义特殊字符以匹配正则表达式,regex,perl,escaping,special-characters,Regex,Perl,Escaping,Special Characters,我正在编写bash函数来处理正则表达式的字符串操作。Bash内置函数在这项工作中非常糟糕,我使用perl命令来完成它 例如,下面是我的“stratch”函数(在bash中): 用法:if(stratch);然后。。。 函数格式{ 本地str=“$1” 本地regex=“$2” 本地perlCmd='if(qq('$str')=~m/'$regex'/g){print“0”}否则{print“1”;}' 返回$(perl-e“$perlCmd”) } 测试字符串:foo-bar\r正在加载。。。

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

例如,下面是我的“stratch”函数(在bash中):

用法:if(stratch);然后。。。 函数格式{ 本地str=“$1” 本地regex=“$2” 本地perlCmd='if(qq('$str')=~m/'$regex'/g){print“0”}否则{print“1”;}' 返回$(perl-e“$perlCmd”) } 测试字符串:
foo-bar\r正在加载。。。xx%\r文件:“一些-(filename.ext)。

正则表达式:
-bar(?:.*)文件:(.\*?)\.ext“

除了一件事之外,一切都正常工作;我无法找到一种方法来正确地转义字符串中的特殊字符以匹配(至少对于其中一些字符)。
我对Perl非常陌生(除了正则表达式语法),所以我尝试了各种各样的方法,但都没有成功

使用“qq”它不处理“(”,它被解释为一个没有匹配的捕获群“)”。我猜“[”…
=> 在-e第1行,靠近“qq(foo-bar\r加载…xx%\r文件:”some-(filename.ext.)=~m/-bar\r(?:*)文件:“(.*)\.ext”/g{”
=> 在-e第1行的EOF之前的任何位置都找不到字符串终止符“)”。

使用“quotemeta”更糟糕的是,在“:”、“%”、“\r”…几乎所有的地方都会中断
=> 在-e行1,靠近“bar\”的位置找到运算符所需的反斜杠
=> %之前缺少运算符或分号

作为奖励,如果我添加“w”或“w”选项来获取perl警告,它不会打印任何内容!!!发生了什么事

我只希望字符串能够包含几乎任何内容,包括“%”、“(”、“[”、“\r”、“\n”…有人知道如何做吗???我做错了什么

编辑:已回答

谢谢你choroba,使用perl参数$ARGV很有魅力。我还使用了ikegami的改进版解决方案,它更优雅

函数现在如下所示:

用法:if(stratch);然后。。。 函数格式{ 本地str=“$1” 本地regex=“$2” 本地perlCmd='exit 1 if($ARGV[0]!~m/$ARGV[1]/g)' perl-e“$perlCmd”--“$str”$regex” 返回美元? }
Edit2:添加“-”以停止处理选项。

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


if(/…/g)
毫无意义,可能会导致微妙的错误。您需要
if(/…/)
我正在使用if($var=~m/../g)什么有效。你是什么意思?我不确定什么需要澄清。删除
-
也是个坏主意。现在如果要搜索的字符串以
-
开头,它将失败。添加了双破折号。顺便问一下,你的意思是使用全局作用域没有用,因为我不关心多次出现?如果是,我知道,这是因为我复制了-p从我的strGetMatches函数中删除它…甚至不需要打印:
perl-e'exit 1 if$ARGV[0]!~m/$ARGV[1]/--“$str”“$regex”
/
return$?
谢谢!这很有帮助。如果在正则表达式中使用“\r”,它会起作用。bar.*”文件:“(.*?\.ext”起作用,但不起作用。“-bar\r.*”文件:“(.*??”.ext'是的。测试:
如果stratch“$(echo-e'foo\rbar')”'foo\rbar';然后echo'match';否则echo'no match';fi
在使用字符串文字时不匹配,但它与-e一起工作,是的。它也与'\\r'一起工作。我正在更新我的原始帖子
\r
不应该与
\
r
这两个字符匹配;它应该与回车符。如果要匹配的话<代码>\和
r
,您需要模式
\\r
。测试:
如果stratch'foo\rbar'foo\\rbar';则回显'match';否则回显'no match';fi
#!/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"'