Regex 不在字符串中的字符的Perl正则表达式
我正在编写一个“编译”shell代码的perl脚本。我需要做的一件事是检测Regex 不在字符串中的字符的Perl正则表达式,regex,string,perl,compiler-construction,Regex,String,Perl,Compiler Construction,我正在编写一个“编译”shell代码的perl脚本。我需要做的一件事是检测字符并对其进行处理(如一行中的多个命令),但仅当它们未转义(通过\)或在字符串中转义时。例如,我们不应该匹配一些;文本;',但是我们应该匹配echo“ignore;inside;”中两个echo语句之间的分号;呼应“某物;”\;'“其他” 在上面的示例中,应该正好匹配两个分号 我已经用正则表达式循环尝试过了 while ($_ =~ /('[^']+')*?("[^"]+")*?(?<!
编码>字符并对其进行处理(如一行中的多个命令),但仅当它们未转义(通过\
)或在字符串中转义时。例如,我们不应该匹配一些;文本;'代码>,但是我们应该匹配echo“ignore;inside;”中两个echo语句之间的分号;呼应“某物;”\;'“其他”代码>
在上面的示例中,应该正好匹配两个分号
我已经用正则表达式循环尝试过了
while ($_ =~ /('[^']+')*?("[^"]+")*?(?<!\\)(?<match>;)/g)
{
print "semiolon: $+{match}\n";
# process the match . . .
}
while($)/('[^']+')*?(“[^']+”*?(?;)/g)
{
打印“semiolon:$+{match}\n”;
#处理比赛。
}
虽然这适用于某些示例,但在某些情况下,它无法正确检测分号位于两个字符串的“内部”,因为它无法在当前匹配之前匹配一对分号。我如何确保只匹配字符串外部的分号
提前感谢。Hmmm,这根本不是你编写解析器的方式。你应该读一些书,然后告诉我们,一个单引号可以出现在双引号内吗?例如“Jo's place“
很抱歉,正如您所发现的,regex不是解析这种类型输入的正确工具。我个人会建立一个简单的有限状态机解析器。可能值得您花时间学习FSM解析。您也可以在这里使用shell代码中的文档,而不仅仅是单引号和双引号字符串。您看到了吗?此外,声明还包含shell代码的解析器。