用于在javascript字符串内外查找文本的正则表达式?

时间:2011-04-08 15:54:18

标签: javascript regex

我正在搜索网站资源(html和javascript)中的文字,并且需要识别在某些情况下会找到此文本的3个正则表达式:

  1. 当它包含在javascript单引号字符串
  2. 中时的一些文本字符串
  3. 当它包含在javascript双引号字符串
  4. 中时的一些文本字符串
  5. 当它不包含在javascript字符串中时的一些文本字符串
  6. 以下是一些可能发生的情况(搜索字符串“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个正则表达式,而不是涵盖所有情况的条件。

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样式字符串与行连续匹配。