代码之家  ›  专栏  ›  技术社区  ›  bgeveritt

获取JavaScript中两个模式之间出现的所有值

  •  0
  • bgeveritt  · 技术社区  · 4 年前

    我必须用下面的长字符串。如何提取“url=”和“,”之间的所有值,以便获得以下数组?

    "load("@bazel_tools//tools/build_defs/repo:http.bzl","http_jar")definclude_java_deps():http_jar(name="com_google_inject_guice",sha256="b378ffc35e7f7125b3c5f3a461d4591ae1685e3c781392f0c854ed7b7581d6d2",url="https://repo1.maven.org/maven2/com/google/inject/guice/4.0/guice-4.0.jar",)http_jar(name="org_sonatype_sisu_inject_cglib",sha256="42e1dfb26becbf1a633f25b47e39fcc422b85e77e4c0468d9a44f885f5fa0be2",url="https://repo1.maven.org/maven2/org/sonatype/sisu/inject/cglib/2.2.1-v20090111/cglib-2.2.1-v20090111.jar",)http_jar(name="javax_inject_javax_inject",sha256="91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff",url="https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar",)"
    
    [
      https://repo1.maven.org/maven2/com/google/inject/guice/4.0/guice-4.0.jar,
      https://repo1.maven.org/maven2/org/sonatype/sisu/inject/cglib/2.2.1-v20090111/cglib-2.2.1-v20090111.jar, 
      https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar
    ]
    

    我尝试了以下方法,但它只给了我第一次出现的机会,但我需要它们。谢谢

    var arr = contents.split('url=').pop().split(',')
    
    for(i in arr) {
        console.log(arr[i]);
    }
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   MarcRo Christian Fritz    4 年前

    您可以使用 Regular Expression

    const regEx = /(?:url=")([^,]+)(?:",)/gm;
    
    const string = 'load("@bazel_tools//tools/build_defs/repo:http.bzl","http_jar")definclude_java_deps():http_jar(name="com_google_inject_guice",sha256="b378ffc35e7f7125b3c5f3a461d4591ae1685e3c781392f0c854ed7b7581d6d2",url="https://repo1.maven.org/maven2/com/google/inject/guice/4.0/guice-4.0.jar",)http_jar(name="org_sonatype_sisu_inject_cglib",sha256="42e1dfb26becbf1a633f25b47e39fcc422b85e77e4c0468d9a44f885f5fa0be2",url="https://repo1.maven.org/maven2/org/sonatype/sisu/inject/cglib/2.2.1-v20090111/cglib-2.2.1-v20090111.jar",)http_jar(name="javax_inject_javax_inject",sha256="91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff",url="https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar",)'
    
    const matches = string.matchAll(regEx);
    
    for (const match of matches) {
      console.log(match[1]);
    }

    或使用字符串方法

    const string = 'load("@bazel_tools//tools/build_defs/repo:http.bzl","http_jar")definclude_java_deps():http_jar(name="com_google_inject_guice",sha256="b378ffc35e7f7125b3c5f3a461d4591ae1685e3c781392f0c854ed7b7581d6d2",url="https://repo1.maven.org/maven2/com/google/inject/guice/4.0/guice-4.0.jar",)http_jar(name="org_sonatype_sisu_inject_cglib",sha256="42e1dfb26becbf1a633f25b47e39fcc422b85e77e4c0468d9a44f885f5fa0be2",url="https://repo1.maven.org/maven2/org/sonatype/sisu/inject/cglib/2.2.1-v20090111/cglib-2.2.1-v20090111.jar",)http_jar(name="javax_inject_javax_inject",sha256="91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff",url="https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar",)'
    
    const arr = string.split('url="');
    const urls = arr
        .filter((subStr) => subStr.includes('https://'))
        .map((subStr) => subStr.split('",)')[0]);
    console.log(urls);

    当然,RegEx解决方案更加灵活。

    请注意,正则表达式可能是“不安全的”,这意味着它们的计算时间可能非常长,具体取决于输入。库,如 this 可以帮助您检测这些