【问题标题】:regex needed for a url patternurl 模式所需的正则表达式
【发布时间】:2018-01-08 17:38:24
【问题描述】:

我正在添加一些简单的路由而不使用任何特定的框架。

当前正则表达式 -->

/^(\w)\/?(\w)\/?(\w)\/?(\d+)$/g

可能的 url 模式是

settings                                // should be matched to --> group1 = settings, group2 = null, group3 = null, group4 = null
settings/                               // should be matched to --> group1 = settings, group2 = null, group3 = null, group4 = null
settings/205                            // should be matched to --> group1 = settings, group2 = null, group3 = null, group4 = 205

settings/notifications                  // should be matched to --> group1 = settings, group2 = notifications, group3 = null, group4 = null
settings/notifications/                 // should be matched to --> group1 = settings, group2 = notifications, group3 = null, group4 = null
settings/notifications/50               // should be matched to --> group1 = settings, group2 = notifications, group3 = null, group4 = 50

settings/notifications/pingers          // should be matched to --> group1 = settings, group2 = notifications, group3 = pingers, group4 = null
settings/notifications/pingers/         // should be matched to --> group1 = settings, group2 = notifications, group3 = pingers, group4 = null
settings/notifications/pingers/101      // should be matched to --> group1 = settings, group2 = notifications, group3 = pingers, group4 = 101

非常感谢您的帮助!

【问题讨论】:

  • 您已经尝试过的正则表达式在哪里,究竟是什么不起作用?
  • 作为大多数“请给出代码”问题,这太宽泛了。请接tour,尤其是How to Ask
  • /? 上拆分会不会容易很多?
  • 不,b/c 我需要填充所有这 4 个组,如果我拆分它,我需要循环遍历数组,这很昂贵。

标签: javascript regex


【解决方案1】:

您可以在/string#split 并测试最后一个单词是否为数字和空字符串并使用解构创建您的对象。

var arr = ['settings', 'settings/','settings/205','settings/notifications','settings/notifications/', 'settings/notifications/50','settings/notifications/pingers','settings/notifications/pingers/','settings/notifications/pingers/101']

var result = arr.map(url => {
  var words = url.split('/');
  var last = null;
  
  if(/\d+/g.test(words[words.length - 1]))
      last = words.pop();
  else if(!words[words.length - 1] || /\s+/g.test(words[words.length - 1]))
    words.pop();
  
  var [group1, group2=null, group3=null] = [...words];
  var group4 = last;
  return {group1, group2, group3, group4};
});

console.log(result);

【讨论】:

  • 谢谢!首先,我不想使用太昂贵的映射或任何其他迭代技术 b/c。其次,我可能会将它与服务器端语言(而不是 node )一起使用,并且不能使用解构和传播之类的东西。所以我真的在寻找一种数学模式
【解决方案2】:

请在 perl 中尝试以下代码。模式本身适用于任何地方。

$string  = "settings/notifications/pingers/101";
#$string  = "settings/notifications/pingers";
#$string  = "settings/notifications";
#$string  = "settings";

$string  =~  m/^(\w+)(?:\/)?(\w+)?(?:\/)?(\w+)?(?:\/)?(\d+)?$/;

print $1."\n"; 
print $2."\n"; 
print $3."\n"; 
print $4."\n"; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多