在JavaScript中,使用正则表达式匹配一个字符串。

3

我在JS中使用正则表达式匹配字符串时遇到了问题。 我可以使用以下方法:

/"[^"]*?"/g

在这个字符串中:
" this is a string "

但是我不能在这里使用那个:
" this is a \"string\" "

如何解决这个问题?谢谢。

1
如果你告诉我们它应该具体匹配什么,可能会更容易一些。 - adeneo
1
请提供有关您的问题的更多信息。您所说的“在此字符串中使用此...”是什么意思?期望的结果是什么? - Felix Kling
你问题中的引号是否是字符串的一部分?例如,当你写下 " this is a string " 时,你是在表达一个18个字符还是20个字符的字符串?你是使用字面符号(其中“/”开始转义序列)还是实际存在于字符串中的逐字值(其中“/”只是一个“/”字符)? - apsillers
我想在一个字符串中匹配字符串。我的意思是,我想用正则表达式匹配那些字符串。我想找到在 " 和 " 之间的任何内容,但不包括 "。 - The Moisrex
你想匹配空字符串,例如 "" 吗? - anubhava
3个回答

3

如果我理解正确,您想要做的是测试字符串是否格式正确?因此不会出现字符串未到达结尾的情况?

如果是这种情况,您可以使用/"(?:[^"\\]|\\.)*"/g


2
这可能更接近他所需的,但我不认为他意识到了。更快的方法是"[^"\\]*(?:\\.[^"\\]*)*" - user557597
@sln 那么为什么要使用如此复杂的正则表达式,当 "(.*)" 可以实现相同的功能呢? - Mazdak
@Kasra - 这并不复杂,这是标准的展开循环方法。它比交替方法快3-5倍。 - user557597
谢谢。最后这个工作得更好了:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*' - The Moisrex
1
现在使用 \"a\" "b" 测试这个解决方案。 - anubhava
@anubhava 那不是必要的。 没有人可以直接在 CSS 或 JavaScript 代码中使用这样的东西。 - The Moisrex

1

@moisrex 在任何情况下都失败了吗? - vks

0
在这种情况下,您不应使用[^"]*,也不需要非贪婪模式,您可以使用以下正则表达式来匹配两个引号之间的所有内容:
/"(.*)"/g

演示

如果您想匹配在 " 之间的任何内容,您可以简单地使用一个字符类内带有空白字符匹配器的单词匹配器,并带有全局修饰符:

/[\w\s]+/g

演示

另一种方法是使用负回顾

/(?<!\\)"(.*?)(?<!\\)"/

@moisrex 它是负向先行断言,将匹配在 ?<! 之后不符合模式的字符串。了解更多信息,请访问 http://www.regular-expressions.info/lookaround.html。 - Mazdak
1
不幸的是,在JavaScript中不支持向后查找。但是感谢您提到这一点。我今天学到了很多。 - The Moisrex
使用 (?<!\\)" 可以防止斜杠前面跟着引号,但在 \\" 这种情况下也会发生,其中引号是由两个(或偶数数量)反斜杠前导的。在这些情况下,引号不再被转义。 - Casimir et Hippolyte
@CasimiretHippolyte,所以在你所谈论的情况下,可能会有很多种情况。这只是这种情况的一个解决方案! - Mazdak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接