如何" It's big \"problem "
使用正则表达式获取子字符串?
s = ' function(){ return " It\'s big \"problem "; }';
如何" It's big \"problem "
使用正则表达式获取子字符串?
s = ' function(){ return " It\'s big \"problem "; }';
Answers:
/"(?:[^"\\]|\\.)*"/
在Regex Coach和PCRE Workbench中工作。
JavaScript测试示例:
var s = ' function(){ return " Is big \\"problem\\", \\no? "; }';
var m = s.match(/"(?:[^"\\]|\\.)*"/);
if (m != null)
alert(m);
(?:...)
是被动或不捕捉的组。这意味着它以后不能被反向引用。
/(["'])(?:[^\1\\]|\\.)*?\1/
正如ePharaoh提供的那样,答案是
/"([^"\\]*(\\.[^"\\]*)*)"/
要使以上内容适用于单引号或双引号字符串,请使用
/"([^"\\]*(\\.[^"\\]*)*)"|\'([^\'\\]*(\\.[^\'\\]*)*)\'/
这里提供的大多数解决方案都使用替代的重复路径,即(A | B)*。
您可能会在大型输入上遇到堆栈溢出,因为某些模式编译器使用递归来实现此目的。
以Java为例: http //bugs.java.com/bugdatabase/view_bug.do?bug_id = 6337993
这样的东西:
"(?:[^"\\]*(?:\\.)?)*"
或Guy Bedford提供的内容将减少解析步骤的数量,从而避免大多数堆栈溢出。
/(["\']).*?(?<!\\)(\\\\)*\1/is
应该与任何带引号的字符串一起使用
这一点在PCRE上可以完美地工作,并且不适合StackOverflow。
"(.*?[^\\])??((\\\\)+)?+"
说明:
"
;。.*?
{Lazy match}; 以非转义字符结尾[^\\]
;(.*?[^\\])??
"
)结尾,但是前面可以有偶数个转义符对(\\\\)+
;并且它是Greedy(!)可选的:((\\\\)+)?+
{Greedy matching},因为字符串可以为空或没有结尾对!"(.*?[^\\])?(\\\\)*"
这是一个同时使用“和”的代码,您可以轻松地在开始时添加其他代码。
(“ |')(?:\\\ 1 | [^ \ 1])*?\ 1
它使用反向引用(\ 1)匹配完全匹配第一组(“或”)中的内容。
[^\1]
应该替换为它,.
因为没有反引用的东西,也没关系。在发生任何不良情况之前,第一个条件将始终匹配。
[^\1]
用.
将有效地改变这一正则表达式("|').*?\1
,然后将匹配"foo\"
在"foo \" bar"
。就是说,[^\1]
要真正开始工作是困难的。@ mathiashansen -你是用笨重和昂贵的更好(?!\1).
(所以整个正则表达式,一些效率清理,会(["'])(?:\\.|(?!\1).)*+\1
的。+
是可选的,如果您的引擎不支持它。
之前未涉及的选项是:
这具有能够正确匹配转义的打开标签的额外好处。
假设您有以下字符串;String \"this "should" NOT match\" and "this \"should\" match"
在这里,\"this "should" NOT match\"
不应该匹配,"should"
应该匹配。最重要的是this \"should\" match
应该匹配\"should\"
而不应该匹配。
首先是一个例子。
// The input string.
const myString = 'String \\"this "should" NOT match\\" and "this \\"should\\" match"';
// The RegExp.
const regExp = new RegExp(
// Match close
'([\'"])(?!(?:[\\\\]{2})*[\\\\](?![\\\\]))' +
'((?:' +
// Match escaped close quote
'(?:\\1(?=(?:[\\\\]{2})*[\\\\](?![\\\\])))|' +
// Match everything thats not the close quote
'(?:(?!\\1).)' +
'){0,})' +
// Match open
'(\\1)(?!(?:[\\\\]{2})*[\\\\](?![\\\\]))',
'g'
);
// Reverse the matched strings.
matches = myString
// Reverse the string.
.split('').reverse().join('')
// '"hctam "\dluohs"\ siht" dna "\hctam TON "dluohs" siht"\ gnirtS'
// Match the quoted
.match(regExp)
// ['"hctam "\dluohs"\ siht"', '"dluohs"']
// Reverse the matches
.map(x => x.split('').reverse().join(''))
// ['"this \"should\" match"', '"should"']
// Re order the matches
.reverse();
// ['"should"', '"this \"should\" match"']
好的,现在解释一下RegExp。这是正则表达式可以很容易地分为三部分。如下:
# Part 1
(['"]) # Match a closing quotation mark " or '
(?! # As long as it's not followed by
(?:[\\]{2})* # A pair of escape characters
[\\] # and a single escape
(?![\\]) # As long as that's not followed by an escape
)
# Part 2
((?: # Match inside the quotes
(?: # Match option 1:
\1 # Match the closing quote
(?= # As long as it's followed by
(?:\\\\)* # A pair of escape characters
\\ #
(?![\\]) # As long as that's not followed by an escape
) # and a single escape
)| # OR
(?: # Match option 2:
(?!\1). # Any character that isn't the closing quote
)
)*) # Match the group 0 or more times
# Part 3
(\1) # Match an open quotation mark that is the same as the closing one
(?! # As long as it's not followed by
(?:[\\]{2})* # A pair of escape characters
[\\] # and a single escape
(?![\\]) # As long as that's not followed by an escape
)
图像形式可能更清晰:使用Jex的Regulex生成
github上的图像(JavaScript正则表达式可视化器)。 对不起,我没有足够高的声誉来包含图像,因此,目前它只是一个链接。
这是使用此概念的示例函数的要点,该概念要先进一些:https : //gist.github.com/scagood/bd99371c072d49a4fee29d193252f5fc#file-matchquotes-js
https://stackoverflow.com/a/10786066/1794894的更广泛版本
/"([^"\\]{50,}(\\.[^"\\]*)*)"|\'[^\'\\]{50,}(\\.[^\'\\]*)*\'|“[^”\\]{50,}(\\.[^“\\]*)*”/
此版本还包含
“
和关闭”
)