我正在搜索网站资源(html和javascript)中的文字,并且需要识别在某些情况下会找到此文本的3个正则表达式:
以下是一些可能发生的情况(搜索字符串“somestring”):
document.write("here is a bunch of text and somestring is inside of it");
var thing = 'here is a bunch of text and somestring is inside of it';
document.write("some text and 'quote' and then somestring here");
document.write('some text and "quote" and then somestring here');
var thing = "some text and '" + quotedVar + "' and then somestring here");
document.write('some text and "' + quotedVar + '" and then ' + " more " + "somestring here");
this string is outside javascript and here is a 'quoted' line and somestring is after it
this string is outside javascript and here is a "quoted" line and somestring is after it
这些示例可能都出现在同一个文件中,因此正则表达式不应假设单个案例。
我尝试过以下方法来查找单引号和双引号字符串,但是我惨遭失败:
单引号:
([=|(|\+]\s*?'[^']*?(?:'[^']*?'[^']*?)*?somestring)
双引号:
([=|(|\+]\s*?"[^"]*?(?:"[^"]*?"[^"]*?)*?somestring)
这些工作在假设正确的条件下,但我尝试过许多真实世界的场景(阅读,真正的javascript文件),他们失败了。非常感谢任何帮助!
编辑:为了澄清,我正在为上面列出的每个条件寻找3个正则表达式,而不是涵盖所有情况的条件。
答案 0 :(得分:2)
答案 1 :(得分:0)
考虑一个初始的'解析'(我使用松散的术语),它产生三个不同的结果流 - 每个搜索域一个。
在此阶段,只需逐步增加步骤,即可在代码/
,'
和"
上停止文件,因为这会更改“上下文”(可能的注释,正则表达式或字符串) 。然后确定(对于/
情况)并使用上下文内容并将其放入适当的结果流中。 (在"foo\"bar\\"
之类的情况下查找结尾仍然有点棘手,但是比正在尝试匹配搜索中的上下文的正则表达式要小得多。)
当这个阶段完成时 - 除了可以验证之外 - 每个单独的流都可以很容易地独立搜索。
快乐的编码。
答案 2 :(得分:0)
在所有情况下,三个正则表达式无法正确处理此问题,因为JavaScript没有常规的词法语法:无法始终识别引号是否以字符串开头。
即使假设您可以正确识别并忽略评论中的引号,正则表达式中的引号也会欺骗您。
例如,
x++/y - "42" /i
VS
x = ++/y - "42"/i
在第一种情况下,引号是字符串的一部分。第一个样本与
相同((x++) / (y - 42)) / i
但在第二种情况下,引号不是字符串的一部分。它与
相同x = ++(new RegExp('y - "42"', 'i'))
这是一个语法上有效但无意义的JavaScript语句。
如果您愿意忽略这样的评论和奇怪的结构,那么您可以使用
匹配字符串/"(?:[^"\\]|\\(?:[^\r]|\r\n?))*"/
和
/'(?:[^'\\]|\\(?:[^\r]|\r\n?))*'/
将使EcmaScript 5样式字符串与行连续匹配。