gpt4 book ai didi

javascript - 将 Python 条件转换为 JavaScript 正则表达式

转载 作者:行者123 更新时间:2023-12-03 12:24:12 24 4
gpt4 key购买 nike

我正在尝试将此 python 正则表达式转换为 javascript 正则表达式

https://github.com/rg3/youtube-dl/blob/a14e1538fe66c49ca8869681d2bbe60a36bd420d/youtube_dl/extractor/youtube.py#L134-L159

r"""(?x)^
(
(?:https?://|//)? # http(s):// or protocol-independent URL (optional)
(?:(?:(?:(?:\w+\.)?[yY][oO][uU][tT][uU][bB][eE](?:-nocookie)?\.com/|
(?:www\.)?deturl\.com/www\.youtube\.com/|
(?:www\.)?pwnyoutube\.com/|
(?:www\.)?yourepeat\.com/|
tube\.majestyc\.net/|
youtube\.googleapis\.com/) # the various hostnames, with wildcard subdomains
(?:.*?\#/)? # handle anchor (#/) redirect urls
(?: # the various things that can precede the ID:
(?:(?:v|embed|e)/) # v/ or embed/ or e/
|(?: # or the v= param in all its forms
(?:(?:watch|movie)(?:_popup)?(?:\.php)?/?)? # preceding watch(_popup|.php) or nothing (like /?v=xxxx)
(?:\?|\#!?) # the params delimiter ? or # or #!
(?:.*?&)? # any other preceding param (like /?s=tuff&v=xxxx)
v=
)
))
|youtu\.be/ # just youtu.be/xxxx
|https?://(?:www\.)?cleanvideosearch\.com/media/action/yt/watch\?videoId=
)
)? # all until now is optional -> you can pass the naked ID
([0-9A-Za-z_-]{11}) # here is it! the YouTube video ID
(?(1).+)? # if we found the ID, everything can follow
$"""

我删除了开始和结束处的引号,添加了开始 /^ 和结束分隔符 /i,转义了正斜杠,删除了自由间距模式,最后得到了这个

var VALID_URL = /^((?:https?:\/\/|\/\/)?(?:(?:(?:(?:\w+\.)?[yY][oO][uU][tT][uU][bB][eE](?:-nocookie)?\.com\/|(?:www\.)?deturl\.com\/www\.youtube\.com\/|(?:www\.)?pwnyoutube\.com\/|(?:www\.)?yourepeat\.com\/|tube\.majestyc\.net\/|youtube\.googleapis\.com\/)(?:.*?\#\/)?(?:(?:(?:v|embed|e)\/)|(?:(?:(?:watch|movie)(?:_popup)?(?:\.php)?\/?)?(?:\?|\#!?)(?:.*?&)?v=)))|youtu\.be\/|https?:\/\/(?:www\.)?cleanvideosearch\.com\/media\/action\/yt\/watch\?videoId=))?([0-9A-Za-z_-]{11})(?(1).+)?$/g;

但是,我使用的 javascript 正则表达式调试器表示关于 python 正则表达式这部分的 javascript 转置,“?”后出现意外字符“(”

(?(1).+)?      # if we found the ID, everything can follow

知道如何解决此错误吗?

最佳答案

JavaScript 不支持条件。

但是正则表达式的世界在没有条件的情况下长期存在,并且有很多方法可以解决它。

想法

那个可怕的正则表达式的基本结构是这样的:

(Capture A)? (Match B) ( If A was captured, (Match C)? )

您可以将IF转换为OR:

(Capture A) (Match B) (Match C)? **OR** (Match B)

转换后的正则表达式

试试这个:

^((?:https?://|//)?(?:(?:(?:(?:\w+\.)?[yY][oO][uU][tT][uU][bB][eE](?:-nocookie)?\.com/|(?:www\.)?deturl\.com/www\.youtube\.com/|(?:www\.)?pwnyoutube\.com/|(?:www\.)?yourepeat\.com/|tube\.majestyc\.net/|youtube\.googleapis\.com/)(?:[^\n]*?#/)?(?:(?:(?:v|embed|e)/)|(?:(?:(?:watch|movie)(?:_popup)?(?:\.php)?/?)?(?:\?|#!?)(?:[^\n]*?&)?v=)))|youtu\.be/|https?://(?:www\.)?cleanvideosearch\.com/media/action/yt/watch\?videoId=)([0-9A-Za-z_-]{11})(?:[^\n]+)?)|^([0-9A-Za-z_-]{11})

说明

如果设置了组 1,(?(1)[^\n]+)? 条件会尝试选择性地匹配 [^\n]+。由于它发生在非可选 ([0-9A-Za-z_-]{11}) 之后,我将条件转换为交替 |

  • 我不对正则表达式的适用性做出任何判断...我重新排列了“语法”而没有查看“单词”。 :)
  • 要么匹配整个第 1 组,现在直接将 ([0-9A-Za-z_-]{11}) 和可选组件放入其中,或者
  • 我们直接匹配 ([0-9A-Za-z_-]{11})
  • 如果您有兴趣检索 ([0-9A-Za-z_-]{11}),根据交替的哪一侧与其匹配,它将存在于不同的捕获中团体。我让你数一下括号。
  • 您可能可以删除很多括号,具体取决于您的需要

引用

关于javascript - 将 Python 条件转换为 JavaScript 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24299384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com