【问题标题】:Regex match quoted string with spaces正则表达式匹配带空格的引号字符串
【发布时间】:2015-06-15 19:20:29
【问题描述】:

我想找到一个匹配被引号包围的字符的正则表达式,其中包含空格

尝试的例子:

adb shell am startservice -n fooApp/barService -a INVOKE --es "key" "key1" --es "value" "value 2 has spaces"

只会在"value 2 has spaces"上匹配一次

到目前为止,我已经得到了这个

"([^"](?<=\s)[^"]*)"

但它正在匹配 " " 介于 key""key1 之间以及介于 value""value" --es "...

我觉得我已经很接近了,但我错过了一些关键的东西。

【问题讨论】:

    标签: regex spaces double-quotes


    【解决方案1】:

    您可以使用此模式并仅提取组 1 的非空值:

    "[^" ]*"|("[^"]*")
    

    【讨论】:

      【解决方案2】:

      你可以使用这个正则表达式:

      (?:"[^"\s]*"[^"]*)*("\S*\s[^"]*")
      

      并抓住捕获的第 1 组

      RegEx Demo

      【讨论】:

      • 匹配 "" " 我可以理解前面的所有对,但它仍然匹配。
      • 那么".*" 是一个更安全的选择。
      • 这适用于平衡引号字符串,而不适用于所有边缘情况,如不平衡或转义引号。
      • 与边缘情况无关,"[^"\s]*\s[^"]" 不会匹配 "" " 但仍能找到空格。
      • "" " 有 3 个引号,因此不平衡。
      【解决方案3】:

      你可以使用这个正则表达式:

      "[^"\s]+[\s]+[^"]*"
      

      Demo

      如果您想确保"value.." 前面有一个空格,即not matched "value ...",请改用这个空格:

      (?<=\s)"[\w]+[\s]+[\d\w\s]*"
      

      Demo

      【讨论】:

        【解决方案4】:

        您无法验证成对引号的整个字符串。
        您唯一能做的就是验证配对(平衡)
        直到您要查找的带引号的字符串。

        你必须强制引擎遵守,即。不要跳过只是为了
        找到匹配。

        您可以强制引擎执行此操作的唯一方法是使用\G
        锚结构。它使引擎匹配
        最后一个匹配停止,否则它会强制它失败,停止匹配
        完全。

        这将实现 -

        \G[^"]*(?:"[^"\s]*"[^"]*)*("[^"\s]*\s[^"]*")

        但是,如果引擎不支持\G 构造,则有其他方式
        要使用的。

         \G                # This MUST match where last match left off
         [^"]*             # Up to the next "
         (?:               # Absorb balanced, non space quotes
              " 
              [^"\s]* 
              " 
              [^"]* 
         )*
         (                 # (1 start), The quotes with spaces.
              "
              [^"\s]* 
              \s 
              [^"]* 
              " 
         )                 # (1 end)
        

        【讨论】:

          猜你喜欢
          • 2016-08-08
          • 2010-09-13
          • 1970-01-01
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-30
          • 2010-12-08
          相关资源
          最近更新 更多