Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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_String_Perl_Compiler Construction - Fatal编程技术网

Regex 不在字符串中的字符的Perl正则表达式

Regex 不在字符串中的字符的Perl正则表达式,regex,string,perl,compiler-construction,Regex,String,Perl,Compiler Construction,我正在编写一个“编译”shell代码的perl脚本。我需要做的一件事是检测字符并对其进行处理(如一行中的多个命令),但仅当它们未转义(通过\)或在字符串中转义时。例如,我们不应该匹配一些;文本;',但是我们应该匹配echo“ignore;inside;”中两个echo语句之间的分号;呼应“某物;”\;'“其他” 在上面的示例中,应该正好匹配两个分号 我已经用正则表达式循环尝试过了 while ($_ =~ /('[^']+')*?("[^"]+")*?(?<!

我正在编写一个“编译”shell代码的perl脚本。我需要做的一件事是检测
字符并对其进行处理(如一行中的多个命令),但仅当它们未转义(通过
\
)或在字符串中转义时。例如,我们不应该匹配一些
;文本;',但是我们应该匹配
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代码的解析器。