Javascript 匹配所有内容,但不匹配带引号的字符串
我希望匹配所有内容,但不匹配带引号的字符串 我可以将所有带引号的字符串与以下内容匹配:Javascript 匹配所有内容,但不匹配带引号的字符串,javascript,regex,Javascript,Regex,我希望匹配所有内容,但不匹配带引号的字符串 我可以将所有带引号的字符串与以下内容匹配:/((“([^“\\]\\\)*”)(“([^“\\]\\\)*”)/ 因此,我尝试将所有内容都匹配,但没有使用引号括起来的字符串:/[^(((([^“\\]\\\\]\\\.*”))(([^'\]\\\\]\\\\\.*)]/,但它不起作用 我只想使用正则表达式,因为我想替换它,并希望在它返回后获得引用的文本 string.replace(regex, function(a, b, c) { // re
/((“([^“\\]\\\)*”)(“([^“\\]\\\)*”)/
因此,我尝试将所有内容都匹配,但没有使用引号括起来的字符串:/[^(((([^“\\]\\\\]\\\.*”))(([^'\]\\\\]\\\\\.*)]/
,但它不起作用
我只想使用正则表达式,因为我想替换它,并希望在它返回后获得引用的文本
string.replace(regex, function(a, b, c) {
// return after a lot of operations
});
带引号的字符串对我来说是这样的“坏字符串”或这“酷字符串”
如果我输入:
he\'re is "watever o\"k" efre 'dder\'4rdr'?
它应输出以下匹配项:
["he\'re is ", " efre ", "?"]
我不想替换它们
我知道我的问题很难,但不是不可能!没有什么是不可能的
谢谢您不能反转正则表达式。您尝试过的是用它创建一个字符类,并将其反转——但如果要这样做,您必须转义所有的右括号“\]” 编辑:我会从
/(^|" |' ).+?($| "| ')/
这将匹配带引号字符串的开头或结尾(非常简单:引号加空格)与字符串结尾或带引号字符串的开头(空格加引号)之间的任何内容。当然,这不会处理任何不遵循方案的转义序列或引号。有关更详细的表达式,请参见上面的答案:-)您不能反转正则表达式。您尝试过的是用它创建一个字符类,并将其反转——但如果要这样做,您必须转义所有的右括号“\]” 编辑:我会从
/(^|" |' ).+?($| "| ')/
这将匹配带引号字符串的开头或结尾(非常简单:引号加空格)与字符串结尾或带引号字符串的开头(空格加引号)之间的任何内容。当然,这不会处理任何不遵循方案的转义序列或引号。有关更详细的表达式,请参见以上答案:-)编辑:重写以覆盖更多边缘情况。
这是可以做到的,但有点复杂
[代码>结果<<代码>结果=主题。匹配(/((以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下简称::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::)方方方问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问\\.\.\'(?:\.\.[^'\\].*”)*(?:\.\.\.[^\\\].*)(?:\.[^'\\].*”)*$)(?:\.[^\\\'])+/g);
会回来的
, he said.
, she replied.
, he reminded her.
,
从该字符串(为清晰起见,添加了换行符并删除了引号):
解释:(有点令人难以置信)
分解正则表达式:
(?)
(?=#断言偶数个(相关)单引号,展望未来:
(?:
(?:\\.|"(?:\\.|[^"\\])*"|[^\\'"])*
'
(?:\\.|"(?:\\.|[^"'\\])*"|[^\\'])*
'
)*
(?:\\.|"(?:\\.|[^"\\])*"|[^\\'])*
$
)
(?=#断言偶数(相关)双引号,展望未来:
(?:
(?:\\.|'(?:\\.|[^'\\])*'|[^\\'"])*
"
(?:\\.|'(?:\\.|[^'"\\])*'|[^\\"])*
"
)*
(?:\\.|'(?:\\.|[^'\\])*'|[^\\"])*
$
)
(?:\.\.[^\\'“])匹配引用节之间的文本
)+
首先,你可以看到有两个相似的部分。这两个前瞻断言都确保前面的字符串中有偶数个单引号/双引号,忽略转义引号和相反类型的引号。我将用单引号部分显示它:
(?=#断言以下内容可以匹配:
(?:#匹配此组:
(?:#匹配以下任一项:
\\.#转义字符
|#或
“(?:\.\.[^”\\])*”#双引号字符串
|#或
[^\\'“]#除反斜杠或引号外的任何字符
)*#任意次数。
“#然后匹配一个引号
(?:\.\.\\”(?:\.\.[^'\]*)*“\\.[^\']]*)*”\35;重复一次以确保偶数,
#(但不允许在嵌套的双引号字符串中使用单引号)
)*#重复任意次数,包括零次
(?:\.\.\\”(?:\.\.[^“\]”)*“\\.[^\\]”)然后匹配相同项,直到。。。
$#…字符串结束。
)#结束先行断言。
双引号部分的工作原理相同
然后,在字符串中这两个断言成功的每个位置,正则表达式的下一部分实际上尝试匹配某些内容:
(?:#匹配其中一个
\\.#转义字符
|#或
[^\\'“]#除反斜杠、单引号或双引号外的任何字符
)#非捕获组结束
整个过程重复一次或多次,尽可能多地重复。修改器/g
确保获得字符串中的所有匹配项
.编辑:重写以覆盖更多边缘情况。
这是可以做到的,但有点复杂
[代码>结果<<代码>结果=主题。匹配(/((以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下简称::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::)方方方问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问问\\.\.\'(?:\.\.[^'\\].*”)*(?:\.\.\.[^\\\].*)(?:\.[^'\\].*”)*$)(?:\.[^\\\'])+/g);
会回来的
, he said.
, she replied.
, he reminded her.
,
从该字符串(为清晰起见,添加了换行符并删除了引号):
解释:(有点令人难以置信)
分解正则表达式:
(?)
(?=#断言偶数个(相关)单引号,展望未来:
(?:
(?:\\.|"(?:\\.|[^"\\])*"|[^\\'"])*
'
(?:\\.|"(?:\\.|[^"'\\])*"|[^\\'])*
'
)*
(?:\\.|"(?:\\.|[^"\\])*"|[^\\'])*
$
)
(?=#断言偶数(相关)双引号,展望未来:
(?:
(?:\\.|'(?:\\.|[^'\\])*'|[^\\'"])*
"
(?:\\.|'(?:\\.|[^'"\\])*'|[^\\"])*
"
)*
(?:\\.|'(?:\\.|[^'\\])*'|[^\\"])*
$
)
(?:\.\.[^\\'“])匹配引用节之间的文本
)+
首先,您可以看到有两个相似的部分