【问题标题】:Regex match all the words outside quotation marks?正则表达式匹配引号外的所有单词?
【发布时间】:2014-12-23 22:35:07
【问题描述】:

是否可以使用标准正则表达式解析器匹配引号外的文本? 我已经看到了这个答案,但它是通过使用 PCRE 完成的:

Can regex match all the words outside quotation marks?

由于使用 PERL,这不是一个纯粹的解决方案。我知道它也可以通过使用编程语言来解决,但想法是使用纯正则表达式解析器。

我做了类似的东西,但它不能正常工作

[^'"]*(?=(?:(['"])+(.*?\1))|([^'"]*$))

提前谢谢你。

UPD1:思路是匹配引号外的任何类型的文本,解决方案一定不能依赖输入。

【问题讨论】:

  • 我不相信有一个单一的正则表达式适用于所有语言。至少会有一个平台不支持特定功能。

标签: regex language-agnostic match


【解决方案1】:
<yourtext>(?=(?:[^"]*"[^"]*")*[^"]*$)

是的,您可以通过使用正向前瞻来做到这一点。但这假设您已经平衡了 " 并且没有在某处存在流浪 "。请参阅演示。

http://regex101.com/r/sU3fA2/29

【讨论】:

  • 你能简单解释一下这个解决方案吗?如果我想逃避\" 而不是" 怎么办?谢谢。
  • @SamKahChiin 它说在text 之后可以有一组" " 在它前面,然后在这些组之前不应该有一个" 直到结束。所以在我们捕获所有"" 组之后的文本之后,如果剩下一个",则失败
  • 为什么我不能用这个捕获{"? ?
  • @AlejandroCotilla 预期的输出是什么
  • @vks 不是真的,我想在双引号之外找到{" 的所有匹配项,专门用于处理 json。
【解决方案2】:

我想出了这个解决方案:

(?:[^"](?=(?:[^"]*?(?:["][^"]*?["][^"]*?)+$)|(?:[^"]*?$)))*|(^[^"]*["][^"]*$)

http://regex101.com/r/pI8xA4/2

如果我们有奇数个引号,它将不会很好地工作 - 在这种情况下,它将跳过第一个引号。 但这对我来说是目前最好的解决方案。

【讨论】:

  • 请接受其中一种解决方案并合理结束问题
【解决方案3】:

此模式将捕获双引号之外的单词

"[^"]+"|(\S+) 

Demo

或者这种模式来捕获双引号之外的句子,你必须修剪多余的空格

"[^"]+"|([^"]+)

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    相关资源
    最近更新 更多