Regex Perl:在字符串中转义特殊字符以匹配正则表达式
我正在编写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”) } 测试字符串: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正在加载。。。
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"'