【问题标题】:Regex for huge string大字符串的正则表达式
【发布时间】:2014-11-10 15:25:45
【问题描述】:

我有以下字符串:

"\n  - MyLibrary1 (= 0.10.0)\n  - AFNetworking (= 1.1.0)\n  - MyLibrary2 (= 3.0.0)\n  - Objective-C-HMTL-Parser (= 0.0.1)\n\n"

我想创建一个这样的 JSON:

{
"MyLibrary1": "0.10.0",
"AFNetworking": "1.1.0",
"MyLibrary2": "3.0.0",
"Objective-C-HMTL-Parser": "0.0.1"
}

为此,我需要将“MyLibrary1”和“0.10.0”以及类似的其他数据分开来创建一个字符串。我正在研究一个正则表达式来从字符串中分离数据。

我尝试了 /-(.*)//=(.*)/ 但这会返回 -= 之后的所有内容。

有没有办法使用单个正则表达式获取所需的数据?另外我如何让正则表达式知道它需要停在()。我正在使用Rubular 进行测试,每当我输入() 时,我都会收到“你有一个不匹配的括号。”

【问题讨论】:

    标签: ruby regex rubular


    【解决方案1】:

    您可以使用以下正则表达式。

    -\s*(\S+)\s*\(\s*=\s*(\S+)\s*\)
    

    您的键匹配结果将在捕获组#1 中,值匹配结果将在组#2

    Rubular

    【讨论】:

    • 我看到这在 Rubular 中有效,但知道为什么它只是重新调整我在 ruby​​ 中的第一个数据,即它返回我“- MyLibrary1 (= 0.10.0)”?我在这里错过了什么吗?我所做的只是将字符串存储在一个名为 dependencies 的变量中,然后在其上使用正则表达式 "dependencies[/-\s*(\S+)\s*(\s*=\s*(\S+))/ ]"
    • 您需要打印匹配组。可能也使用扫描
    • 是的,扫描有帮助。谢谢!
    【解决方案2】:

    似乎适用于您的示例。

     # -\s*(.*?)\s*\(\s*=\s*(.*?)\s*\)
    
     -
     \s* 
     ( .*? )        # (1)
     \s* 
     \(
     \s* 
     =
     \s* 
     ( .*? )        # (2)
     \s* 
     \)
    

    或者,您可以进行一些温和的验证。请注意,仅使用惰性量词
    修剪空白。

     # -\s*([^()=]*?)\s*\(\s*=\s*([^()=-]*?)\s*\)
    
     -
     \s* 
     ( [^()=]*? )  # (1)
     \s* 
     \(
     \s* 
     =
     \s* 
     ( [^()=-]*? )  # (2)
     \s* 
     \)
    

    【讨论】:

    • 您的解决方案正在使用 rubular,但知道为什么当我在 ruby​​ 中使用它时它只返回第一个数据吗?在 ruby​​ 中使用时我需要添加一些东西吗?我正在做 dependencies.match(/-\s*(.*?)\s*(\s*=\s*(.*?)\s*)/) 其中“dependencies”变量中有字符串。
    • 在 ruby​​ 中它只返回我 #
    • 应该只使用全局范围内的搜索功能(全局修饰符)。此外,您感兴趣的返回的是捕获组 1 和 2,而不是整个匹配。
    • 从你的字符串中它的 1:"MyLibrary1" 2:"0.10.0"
    【解决方案3】:
    -\s{1}([A-Za-z0-9]+)\s+\(=\s+([0-9\.]+)\)
    

    将返回匹配项:

    $1 AFNetworking $2 1.1.0

    等等……

    Rubular

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      相关资源
      最近更新 更多