【问题标题】:Regex to detect a string that contains a URL or file extension正则表达式检测包含 URL 或文件扩展名的字符串
【发布时间】:2013-09-02 12:25:46
【问题描述】:

我正在尝试创建一个小脚本来检测字符串输入是否为:

1) 一个 URL(将包含一个文件名):'http://ajax.googleapis.com/html5shiv.js'

2) 只是一个文件名:'html5shiv.js'

到目前为止,我已经找到了这个,但我认为它只是检查 URL 和文件扩展名。有没有一种简单的方法可以使它使用“或”检查?我对 RegExp 不是很有经验。

var myRegExp = /[^\\]*\.(\w+)$/i;

提前谢谢你。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    看看这个(根本不需要正则表达式):

    var filename = string.indexOf('/') == -1
                 ? string
                 : string.split('/').slice(-1)[0];
    

    【讨论】:

    • 非常酷。我正在重用一个不同的正则表达式,因为在此函数调用之前我实际上使用了 .test() 来返回它是否有文件的布尔值。
    • 好的,不知道你需要使用正则表达式。但为什么要投反对票?
    • Array 在任何当前的 ES 规范中都没有 last() 方法。我认为。
    【解决方案2】:

    是的,您可以使用交替运算符|。不过要小心,因为它的优先级很低。低于测序。你需要写/(cat)|(dog)/之类的东西。

    用这么少的用例/测试用例很难理解你到底想要什么,但是

    (http://[a-zA-Z0-9\./]+)|([a-zA-Z0-9\.]+)
    

    应该给你一个起点。

    【讨论】:

      【解决方案3】:

      如果是 URL,则将其剥离到最后一部分,并将其视为“只是一个文件名”。

      function isFile(fileOrUrl) {
          // This will return everything after the last '/'; if there's
          // no forward slash in the string, the unmodified string is used
          var filename = fileOrUrl.split('/').pop();
          return (/.+\..+/).test(filename);
      }
      

      【讨论】:

        【解决方案4】:

        这个正则表达式怎么样?

        (\.js)$
        

        它检查行尾是否有 .js。

        $ 表示行尾。

        tested here.

        【讨论】:

        • \. 而不是 .
        【解决方案5】:

        基本上,要在正则表达式中使用“OR”,只需使用“管道”分隔符即可。

        (aaa|bbb)
        

        将匹配

        aaa
        

        bbb
        

        对于匹配 url 的正则表达式,我建议如下:

        \w+://[\w\._~:/?#\[\]@!$&'()*+,;=%]*
        

        这是基于allowed character set 的网址。

        对于文件,您对文件名的定义是什么?

        如果您想搜索匹配“(至少)一对多非句号字符,后跟一个句号,然后是(至少)一对多非句号字符”的字符串,我建议以下正则表达式:

        [^\.]+\.[^\.]+
        

        总的来说:

        (\w+://[\w\._~:/?#\[\]@!$&'()*+,;=%]*|[^\.]+\.[^\.]+)
        

        这是一个工作示例(在 javascript 中):jsfiddle

        您可以在这里在线测试正则表达式:http://gskinner.com/RegExr/

        【讨论】:

        • 为什么网址正则表达式中没有%
        • 好问题!答案是我很懒,只是从这个答案中直接撕掉了有效字符(应该正确地完成我的作业)-stackoverflow.com/questions/7109143/…!我已更新答案以包含“%”。
        【解决方案6】:

        试试这个:

        var ajx = 'http://ajax.googleapis.com/html5shiv.js';
        function isURL(str){
          return /((\/\w+)|(^\w+))\.\w{2,}$/.test(str);
        }
        console.log(isURL(ajx));
        

        【讨论】:

          【解决方案7】:

          这是程序!

          <script>
          var url="Home/this/example/file.js";
          var condition=0;
          var result="";
          for(var i=url.length; i>0 && condition<2 ;i--)
          {
              if(url[i]!="/" && url[i]!="."){result= (condition==1)? (url[i]+result):(result);}
              else{condition++;}
          }
          document.write(result);
          </script>
          

          【讨论】:

            【解决方案8】:

            如果是为了流量控制,你可以这样做:

            var test = "http://ajax.googleapis.com/html5shiv.js";    
            
            // to recognize http & https
            var regex = /^https?:\/\/.*/i;    
            var result = regex.exec(test);    
            if (result == null){
                // no URL found code
            } else {
                // URL found code
            }
            

            为了捕获您可以使用的文件名:

            var test = "http://ajax.googleapis.com/html5shiv.js";    
            
            var regex = /(\w+\.\w+)$/i;    
            var filename = regex.exec(test);    
            

            【讨论】:

              猜你喜欢
              • 2016-12-24
              • 1970-01-01
              • 2017-07-22
              • 1970-01-01
              • 2011-07-06
              • 2017-12-17
              • 2021-09-07
              • 1970-01-01
              相关资源
              最近更新 更多