正则表达式在Perl中不匹配,在Sublime Text 3上也是如此

时间:2014-11-12 20:45:34

标签: regex perl

我有一个正则表达式,我试图匹配包含:

的字符串
<script type="text/javascript">
   var debug = new Debugger();
</script>

我已经确定使用“debug”这个词来匹配就足够了。

如果我执行命令:

find . -name 'test.html' -exec perl -ne '/<script type="text\/javascript">[\S\s]*?(debug)[\S\s]*?<\/script>/ && print' '{}' \;

我希望正则表达式匹配,就像正则表达式字符串

一样
 <script type="text\/javascript">[\S\s]*?(debug)[\S\s]*?<\/script>

与崇高文本匹配。

我在使用Perl的[\ S \ s]时遇到了麻烦。我在这里缺少什么吗?

由于

2 个答案:

答案 0 :(得分:0)

你想在调用它时使用perl的段落模式(-0)。使用它,你的正则表达式将起作用:

find . -name 'test.html' -exec perl -n0e '/<script type="text\/javascript">[\S\s]*?(debug)[\S\s]*?<\/script>/ && print' '{}' \;

(不是?)令人惊讶的是@sputnick获得了这个答案的金牌here;)

答案 1 :(得分:0)

编辑我没有看到文件存在问题。但这只是使 现在有两个问题。考虑改为运行Perl脚本并修改记录
{ $/ = undef; $data = <$file>; ... }或类似范围内的分隔符。


您知道有关在html上使用正则表达式的警告。

一个点:[\S\s]使用内联修饰符相当于(?s:.) 并且在Perl中不会成为问题。

非贪婪无济于事,它希望在脚本标记中找到debug,它会 从第一个标记中获取并匹配所有其他标记,直到找到debug然后发送 寻找一个贴心的标签。

这是唯一可能出现的问题。为了防止你必须检查
脚本的内容好一点。

 #  /(?s)<script\s+type="text\/javascript">(?:(?!<\/?script).)*?(debug)(?:(?!<\/?script).)*?<\/script>/

 (?s)
 <script \s+ type="text/javascript">
 (?:
      (?! </?script )
      . 
 )*?
 ( debug )
 (?:
      (?! </?script )
      . 
 )*?
 </script>