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”]
我想知道执行速度,我怀疑运行一个大型正则表达式(与每个谨慎操作的几个正则表达式相比)可能更快,这个例子实际上更快(即使使用