如何" It's big \"problem "
使用正则表达式获取子字符串?
s = ' function(){ return " It\'s big \"problem "; }';
Run Code Online (Sandbox Code Playgroud)
Phi*_*Lho 144
/"(?:[^"\\]|\\.)*"/
Run Code Online (Sandbox Code Playgroud)
适用于Regex Coach和PCRE Workbench.
JavaScript中的测试示例:
var s = ' function(){ return " Is big \\"problem\\", \\no? "; }';
var m = s.match(/"(?:[^"\\]|\\.)*"/);
if (m != null)
alert(m);
Run Code Online (Sandbox Code Playgroud)
小智 28
这个来自许多Linux发行版中的nanorc.sample.它用于C样式字符串的语法高亮显示
\"(\\.|[^\"])*\"
Run Code Online (Sandbox Code Playgroud)
小智 17
正如ePharaoh所提供的,答案是
/"([^"\\]*(\\.[^"\\]*)*)"/
Run Code Online (Sandbox Code Playgroud)
要将上述内容应用于单引号或双引号字符串,请使用
/"([^"\\]*(\\.[^"\\]*)*)"|\'([^\'\\]*(\\.[^\'\\]*)*)\'/
Run Code Online (Sandbox Code Playgroud)
这里提供的大多数解决方案使用替代的重复路径,即(A | B)*.
您可能会遇到大型输入上的堆栈溢出,因为某些模式编译器使用递归实现此操作.
例如Java:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6337993
像这样的东西:
"(?:[^"\\]*(?:\\.)?)*"
或者Guy Bedford提供的那个将减少解析步骤的数量,避免大多数堆栈溢出.
小智 8
/(["\']).*?(?<!\\)(\\\\)*\1/is
Run Code Online (Sandbox Code Playgroud)
应该适用于任何带引号的字符串
小智 8
"(?:\\"|.)*?"
Run Code Online (Sandbox Code Playgroud)
交替\"
和.
传递转义的转义,而惰性量词*?
确保您不会超过引用字符串的末尾.适用于.NET Framework RE类
/"(?:[^"\\]++|\\.)*+"/
Run Code Online (Sandbox Code Playgroud)
直接从man perlre
安装了Perl 5.22.0的Linux系统上获取.作为优化,这个正则表达式使用两者的'posessive'形式+
并*
防止回溯,因为事先已知在没有结束引用的字符串在任何情况下都不匹配.
这个在 PCRE 上工作得很好,并且不属于 StackOverflow。
"(.*?[^\\])??((\\\\)+)?+"
Run Code Online (Sandbox Code Playgroud)
解释:
"
;.*?
{Lazy match}; 以非转义字符结尾[^\\]
;(.*?[^\\])??
"
)结尾,但它前面可以有偶数个转义符号对(\\\\)+
;它是 Greedy(!) 可选的:((\\\\)+)?+
{Greedy matching},因为字符串可以为空或没有结尾对!