【问题标题】:Escape quotation mark in regex expression正则表达式中的转义引号
【发布时间】:2021-08-04 11:03:28
【问题描述】:

我正在尝试使用正则表达式提取要下载的 URL,但我无法处理后向和正前向中的引号。

你能解决它吗?

输入:document.getElementsByClassName('mdui-textfield-input')[1].innerHTML

输出:"<video><source src=\"https://drivebutler.drk1.workers.dev/0:/Cartoon%20Collection/Naruto%20Shippuden%20(Complete%20Series%20001-500)%20Naruto%20Shippuuden%20[1080p]%20[HEVC]%20[x265]%20[Batch]%20[pseudo]/Season%2015%20(Episodes%20321-348)/[AnimeRG]%20Naruto%20Shippuden%20-%20338%20[1080p]%20[x265]%20[pseudo].mkv\" type=\"video/mp4\"></video>"

我用来抓取网址的正则表达式,

(?<=src=\\\").*?(?=\\\")

我已经尝试过,

document.getElementsByClassName('mdui-textfield-input')[1].innerHTML.match((?<=src=\\\").*?(?=\\\"))[0]

但是控制台的提示让我觉得有些不对劲。

Test it!

【问题讨论】:

  • 引号不需要转义...是吗?
  • @Bravo 因为我不想记住非字母字符是否需要转义,所以我通常将它们作为原则进行转义,只要我没有得到任何意外行为。
  • 你应该使用类似regexr.com的东西来检查你的正则表达式。在 JS 中使用斜杠将正则表达式括起来:.match(/.*/)。是的,您不需要转义引号。
  • 什么是mdui-textfield-input?输入或文本区域应该有一个.value。不要为此使用.innerHTML
  • 顺便说一句,我很确定您的字符串不包含任何反斜杠。这只是字符串文字的控制台输出(在开头和结尾使用" 作为分隔符)。

标签: javascript regex escaping


【解决方案1】:

您没有像这样将正则表达式括在斜线之间:

.match(/(?<=src=\\\").*?(?=\\\")/)

检查如何在 JavaScript here 中使用 文字表示法 创建正则表达式。

如果你想转义一个特殊字符你应该使用单反斜杠,因为现在你要转义一个反斜杠和一个引号,所以我想你希望它是这样的:

.match(/(?<=src=\").*?(?=\")/)

但无论如何你都不需要转义引号之类的字符。

【讨论】:

    【解决方案2】:

    .../src=\\"(?&lt;url&gt;https?:\/\/[^"]+)"/ ...并且始终牢记在出于输入原因而必须在字符串中写入反斜杠时 "behave" 的方式以及系统如何将它们作为输出值...

    const sample = "&lt;video&gt;&lt;source src=\\\"https://drivebutler.drk1.workers.dev/0:/Cartoon%20Collection/Naruto%20Shippuden%20(Complete%20Series%20001-500)%20Naruto%20Shippuuden%20[1080p]%20[HEVC]%20[x265]%20[Batch]%20[pseudo]/Season%2015%20(Episodes%20321-348)/[AnimeRG]%20Naruto%20Shippuden%20-%20338%20[1080p]%20[x265]%20[pseudo].mkv\" type=\"video/mp4\"&gt;&lt;/video&gt;"
    
    const regXExtractUrl = (/src=\\"(?<url>https?:\/\/[^"]+)"/);
    
    console.log(
      regXExtractUrl.exec(sample)?.groups.url
    );
    console.log(
      regXExtractUrl.exec("")?.groups.url
    );
    .as-console-wrapper { min-height: 100%!important; top: 0; }

    不同的转义...不同的正则表达式...

    const sample_A = "&lt;video&gt;&lt;source src=\"https://drivebutler.drk1.workers.dev/0:/Cartoon%20Collection/Naruto%20Shippuden%20(Complete%20Series%20001-500)%20Naruto%20Shippuuden%20[1080p]%20[HEVC]%20[x265]%20[Batch]%20[pseudo]/Season%2015%20(Episodes%20321-348)/[AnimeRG]%20Naruto%20Shippuden%20-%20338%20[1080p]%20[x265]%20[pseudo].mkv\" type=\"video/mp4\"&gt;&lt;/video&gt;"
    
    const sample_B = `&lt;video&gt;&lt;source src="https://drivebutler.drk1.workers.dev/0:/Cartoon%20Collection/Naruto%20Shippuden%20(Complete%20Series%20001-500)%20Naruto%20Shippuuden%20[1080p]%20[HEVC]%20[x265]%20[Batch]%20[pseudo]/Season%2015%20(Episodes%20321-348)/[AnimeRG]%20Naruto%20Shippuden%20-%20338%20[1080p]%20[x265]%20[pseudo].mkv" type="video/mp4"&gt;&lt;/video&gt;`
    
    const regXExtractUrl = (/src="(?<url>https?:\/\/[^"]+)"/);
    
    console.log(
      regXExtractUrl.exec(sample_A)?.groups.url
    );
    console.log(
      regXExtractUrl.exec(sample_B)?.groups.url
    );
    console.log(
      regXExtractUrl.exec("")?.groups.url
    );
    .as-console-wrapper { min-height: 100%!important; top: 0; }

    【讨论】:

      【解决方案3】:

      我通过以下方式修复它

      document.getElementsByClassName('mdui-textfield-input')[1].innerHTML.match(/(?<=src=\").*?(?=\")/g)[0]
      

      【讨论】:

        猜你喜欢
        • 2018-10-20
        • 2021-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-01
        • 2013-05-10
        • 1970-01-01
        相关资源
        最近更新 更多