【问题标题】:Javascript regular expression: remove first and last slashJavascript正则表达式:删除第一个和最后一个斜杠
【发布时间】:2011-04-19 22:17:48
【问题描述】:

我在 javascript 中有这些字符串:

/banking/bonifici/italia
/banking/bonifici/italia/

如果第一个和最后一个斜杠存在,我想删除它。

我尝试了^\/(.+)\/?$,但它不起作用。

阅读stackoverflow中的一些帖子,我发现php具有修剪功能,我可以使用他的javascript翻译(http://phpjs.org/functions/trim:566),但我更喜欢“简单”的正则表达式。

【问题讨论】:

标签: javascript regex


【解决方案1】:
return theString.replace(/^\/|\/$/g, '');

“用空字符串替换所有 (/.../g) 前导斜杠 (^\/) 或 (|) 尾随斜杠 (\/$)。”

【讨论】:

  • 我修改了这个以删除任意数量的前导或尾随斜杠,使用“+”:replace(/^\/+|\/+$/g, '')
  • 如果字符串是//www.google.com怎么办? // 将被错过。
  • @IsaacFerreira 你可以使用这个/^\s*\/*\s*|\s*\/*\s*$/gm 它会处理斜线前后的一些可能的空白以及添加 * 的多个斜线
【解决方案2】:

这里没有真正的理由使用正则表达式,字符串函数可以正常工作:

var string = "/banking/bonifici/italia/";
if (string.charAt(0) == "/") string = string.substr(1);
if (string.charAt(string.length - 1) == "/") string = string.substr(0, string.length - 1);
// string => "banking/bonifici/italia"

jsFiddle 上查看此操作。

参考资料:

【讨论】:

  • 我认为有时避免使用正则表达式有助于提高可读性,但在这种情况下,使用 1 行正则表达式和 1 行注释实际上会以更优雅的方式完成这项工作。
  • 这不会删除字符串开头或结尾处的重复斜杠 ("//banking/bon/ita//"),正则表达式如 replace(/^\/+|\/+ $/g, '') 会。
  • 我不认为它甚至有助于提高可读性,它只是成为一个人可以理解正则表达式的程度的测试。我认为大多数人可以在几秒钟后知道 /^\/|\/$/g 做了什么,尤其是在其他非正则表达式代码的上下文中。所以在这种情况下,正则表达式是更好的 IMO。
【解决方案3】:

如果使用 RegExp 不是一个选项,或者您必须在处理 URL 时处理极端情况(例如双/三斜杠或没有复杂替换的空行),或使用额外的处理,这里有一个不太明显但更实用的解决方案:

const urls = [
  '//some/link///to/the/resource/',
  '/root',
  '/something/else',
];

const trimmedUrls = urls.map(url => url.split('/').filter(x => x).join('/'));

console.log(trimmedUrls);

在这个 sn-p filter() 函数中,可以实现比仅过滤空字符串(这是默认行为)更复杂的逻辑。

警告 - 这不像这里的其他 sn-ps 快。

【讨论】:

    【解决方案4】:

    以防万一有人在这里需要过早的优化...

    http://jsperf.com/remove-leading-and-trailing-slashes/5

    var path = '///foo/is/not/equal/to/bar///'
    var count = path.length - 1
    var index = 0
    
    while (path.charCodeAt(index) === 47 && ++index);
    while (path.charCodeAt(count) === 47 && --count);
    
    path = path.slice(index, count + 1)
    

    【讨论】:

    • @benraay 你需要帮助理解它吗?
    • @MilenGeorgiev 不,谢谢,我只是说这个版本的代码比使用 RegEx 的版本可读性差,它们有时难以理解,但theString.replace(/^\/|\/$/g, '')对于阅读代码,但可能比这个慢!
    【解决方案5】:

    一个衬里,没有正则表达式,处理多次出现

    const trimSlashes = str => str.split('/').filter(v => v !== '').join('/');
    
    console.log(trimSlashes('/some/path/foo/bar///')); // "some/path/foo/bar"
    

    【讨论】:

      【解决方案6】:

      您可以检查 str.startsWith 和 str.endsWith 如果存在则 substr

        var str= "/aaa/bbb/";
        var str= str.startsWith('/') ? str.substr(1) : str;
        var str= str.endsWith('/') ? str.substr(0,str.length - 1) : str;
      

      或者你可以编写自定义函数

      trimSlashes('/aaa/bbb/');
      
      function trimSlashes(str){
        str= str.startsWith('/') ? str.substr(1) : str;
        str= str.endsWith('/') ? str.substr(0,str.length - 1) : str;
        return str;
      }
      

      【讨论】:

        猜你喜欢
        • 2020-05-15
        • 2022-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-18
        相关资源
        最近更新 更多