2015-07-02 28 views

回答

0

提取任何非空的“本”的]前值,你可以使用

\bthis:"([^"]+)(?=[^\]]*]) 

demo,你的价值是在第1组

\bthis:"子模式检查是否存在this:"在由1个或多个符号组成的非引号字符串([^"]+)之前,并且(?=[^]]*])前瞻检查在]之前是否有除]之外的字符序列。

+0

你如何知道支持向后看...... – vks

+0

从regex101的链接中,选择PCRE。 –

+0

我想这一定是默认的一个.....反正让我们等待oP – vks

0

您需要使用肯定的超前断言。

\bthis:\"([^"]+)\"(?=[^\]]*\]) 

DEMO

然后,如果使用的是一个PCRE正则表达式引擎(PHP,R)或Perl抓住你从组索引1

0

想要的串,则可以使用这种模式的:

this:"\K[^"]+(?=")|](*COMMIT)(*F) 

demo

\K和lookahead (?=")在此处用于避免创建捕获组。 \K从整个比赛中删除左侧的所有内容。因此整个比赛只包含引号之间的内容。

回溯控制动词(*COMMIT)强制整个比赛失败,如果模式后来失败。由于(*F)使模式失败,因此在达到]时停止研究。

+0

顺便说一句,你甚至不需要预见:'this:“\ K [^”] + |](* COMMIT)(* F)'就够了。我没有得到你对'\ K和前瞻(?=“)的解释,这里用来避免创建一个捕获组。”我在这里没有看到任何捕获组。那么,用简单的术语来说,'](* COMMIT)(* F)'在这里只是一种预测 - 使用它而不是向前看有什么好处? –

+1

@stribizhev:前瞻只是在这里更具描述性(因为它可能会阻止匹配字符串末尾的不平衡报价)。关于构造'](* COMMIT)(* F)',主要的兴趣在于避免为每个匹配测试字符串直到']'。 –

+0

@stribizhev:为了更高效,模式可以这样写:'〜this:“\ K([^”] *(?=“)|](* COMMIT)(* F)〜S', 'S'修饰符改进了搜索,当一个交替的分支开始于一个文字时,不幸的是regex101不支持这个修饰符。 –