我有一个正则表达式,我试图匹配包含:
的字符串<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]时遇到了麻烦。我在这里缺少什么吗?
由于
答案 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>