Javascript RegExp-查找所有事件,但不在引号内

Javascript RegExp-查找所有事件,但不在引号内,javascript,regex,Javascript,Regex,我有以下文本(它是字符串值,不是语言表达式): 我想找出所有没有用双引号或单引号括起来的单词([a-zA-Z]+)。引号可以转义(\“或\”)。结果应该是: hello, world, gizmo, hoozit 我可以在JavaScript中使用正则表达式吗?您可以使用此模式,您需要的是第二个捕获组: 编辑:略短一点,带有负前瞻性: var re = /(['"])(?:[^"'\\]+|(?!\1)["']|\\{2}|\\[\s\S])*\1|([a-z]+)/ig var mystr

我有以下文本(它是字符串值,不是语言表达式):

我想找出所有没有用双引号或单引号括起来的单词(
[a-zA-Z]+
)。引号可以转义(
\“
\”
)。结果应该是:

hello, world, gizmo, hoozit

我可以在JavaScript中使用正则表达式吗?

您可以使用此模式,您需要的是第二个捕获组:

编辑:略短一点,带有负前瞻性:

var re = /(['"])(?:[^"'\\]+|(?!\1)["']|\\{2}|\\[\s\S])*\1|([a-z]+)/ig

var mystr = 'hello = world + \'foo bar\' + gizmo.hoozit + "escaped \\"quotes\\"";';

var result = Array();
while (match = re.exec(mystr)) {
    if (match[2]) result.push(match[2]);
}

console.log(mystr);
console.log(result);
这样做的目的是匹配目标之前引号中包含的内容

随附的内容详细信息:
”(?:[^'\\]+\\{2}\\\\[\s\s])*”


(*偶数个反斜杠不会漏掉任何东西)

您可以使用此模式,您需要的是第二个捕获组:

编辑:略短一点,带有负前瞻性:

var re = /(['"])(?:[^"'\\]+|(?!\1)["']|\\{2}|\\[\s\S])*\1|([a-z]+)/ig

var mystr = 'hello = world + \'foo bar\' + gizmo.hoozit + "escaped \\"quotes\\"";';

var result = Array();
while (match = re.exec(mystr)) {
    if (match[2]) result.push(match[2]);
}

console.log(mystr);
console.log(result);
这样做的目的是匹配目标之前引号中包含的内容

随附的内容详细信息:
”(?:[^'\\]+\\{2}\\\\[\s\s])*”


(*偶数个反斜杠不会逃过任何限制)

为了简单明了,您可能需要一个接一个地使用几种正则表达式方法(大型正则表达式可能很快,但它们很难构造、理解和编辑):首先删除所有转义引号,然后删除所有带引号的字符串,然后运行搜索

var matches = string
  .replace( /\\'|\\"/g,         '' )
  .replace( /'[^']*'|"[^']*"/g, '' )
  .match( /\w+/g );
有关涉及的正则表达式的一些注释:

  • 第二次替换中的中心构造是字符(
    ),后跟集合(
    []
    )中任何不符合字符(
    ^
    )的字符(
    *
    )的零个或多个(
    *
  • |
    表示或,表示管道前后的零件可以匹配
  • “\w”表示“任意单词字符”,是“[a-zA-Z]”的简写形式

.

为了函数的简单性和清晰性,您可能需要一个接一个地使用几种正则表达式方法(大型正则表达式可能很快,但它们很难构造、理解和编辑):首先删除所有转义引号,然后删除所有带引号的字符串,然后运行搜索

var matches = string
  .replace( /\\'|\\"/g,         '' )
  .replace( /'[^']*'|"[^']*"/g, '' )
  .match( /\w+/g );
有关涉及的正则表达式的一些注释:

  • 第二次替换中的中心构造是字符(
    ),后跟集合(
    []
    )中任何不符合字符(
    ^
    )的字符(
    *
    )的零个或多个(
    *
  • |
    表示或,表示管道前后的零件可以匹配
  • “\w”表示“任意单词字符”,是“[a-zA-Z]”的简写形式

  • 用空字符串替换每个转义引号
  • 将每对引号和之间的字符串替换为空字符串:
    • 如果对开头引号
      ([“'))
      使用捕获组,则可以使用反向引用
      \1
      来匹配引号字符串另一端的相同样式引号
    • 与反向引用匹配意味着您需要使用非贪婪(匹配尽可能少的字符)通配符匹配
      *?
      ,以获得可能最小的带引号的字符串
  • 最后,使用正则表达式
    [a-zA-Z]+
    查找匹配项
  • 像这样:

    var text = "hello = world + 'foo bar' + gizmo.hoozit + \"escaped \\\"quotes\\\"\";";
    
    var matches = text.replace( /\\["']/g,      '' )
                      .replace( /(["']).*?\1/g, '' )
                      .match(   /[a-zA-Z]+/g );
    
    console.log( matches );
    
  • 用空字符串替换每个转义引号
  • 将每对引号和之间的字符串替换为空字符串:
    • 如果对开头引号
      ([“'))
      使用捕获组,则可以使用反向引用
      \1
      来匹配引号字符串另一端的相同样式引号
    • 与反向引用匹配意味着您需要使用非贪婪(匹配尽可能少的字符)通配符匹配
      *?
      ,以获得可能最小的带引号的字符串
  • 最后,使用正则表达式
    [a-zA-Z]+
    查找匹配项
  • 像这样:

    var text = "hello = world + 'foo bar' + gizmo.hoozit + \"escaped \\\"quotes\\\"\";";
    
    var matches = text.replace( /\\["']/g,      '' )
                      .replace( /(["']).*?\1/g, '' )
                      .match(   /[a-zA-Z]+/g );
    
    console.log( matches );
    

    hello=world+'foo-bar'+gizmo.hoozit+“转义\”引号\“;
    它是变量中的字符串,或者它使用其他变量创建字符串变量
    hello
    字符串,而不是实际的JavaScript代码。
    hello=world+'foo-bar'+gizmo.hoozit+“转义\”引号\”";它是变量中的字符串,或者它使用另一个变量创建字符串变量
    hello
    ?字符串,不是实际的JavaScript代码。文本不是表达式,它只是原始文本(存储在文件或字符串变量中)。@MartinMajer Haha,很抱歉,我只是在发表了我对你的坏例子的屈尊评论后才想到这一点。现在要重新编辑以删除该位。我的答案中有新的解决方案!我不得不将
    replace(…)
    更改为
    replace(…,'')
    ,但它似乎起了作用。@MartinMajer我想这是不被接受的,因为你想要的解决方案是用一个正则表达式执行一个方法?文本不是表达式,它只是原始文本(存储在文件或字符串变量中)。@MartinMajer Haha,很抱歉,我只是在发表我对你的坏榜样的屈尊评价后才想到这一点。现在要重新编辑以删除该位。我的答案中有新的解决方案!我不得不将
    replace(…)
    更改为
    replace(…,'')
    ,但它似乎起了作用。@MartinMajer我想这是不被接受的,因为您想要的解决方案是用一个正则表达式执行一个方法?它返回
    [“hello”,“world”,“gizmo”,“hoozit”,“quotes”]
    -但是
    “quotes”
    不应该在那里。@MartinMajer:是的,因为要在字符串中表示文字反斜杠,必须对其进行转义。我忘了在测试字符串中转义它们。但是它工作得很好,你现在就可以测试它了。+1确认正常工作,很好的解决方案
    [“hello”,“world”,“gizmo”,“hoozit”]
    我想知道执行速度,我怀疑运行一个大型正则表达式(与每个谨慎操作的几个正则表达式相比)可能更快,这个例子实际上更快(即使使用