第 105 题:编程题 匹配查找特定字符串

发布于 2022-08-21 11:26:19 字数 415 浏览 141 评论 28

url 有三种情况

https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=&local_province_id=33
https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=800&local_province_id=33
https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=800,700&local_province_id=33

匹配 elective 后的数字输出(写出你认为的最优解法):

[] || ['800'] || ['800','700']

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(28

一场信仰旅途 2022-05-04 13:55:29
function getUrlValue(url, param) {
	let query = url.split('?')[1]
	if(query) {
		let m = query.split('&')
		for(let i = 0; i<m.length; i++){
			let n = m[i].split('=')
			if(n[0] === param) { 
				return n[1] 
                        }
		}
	}
	return undefined
}
梦巷^ 2022-05-04 13:55:29

模拟第一位大佬的做法
var getUrlValue = function(urls){
if(!urls)return;
let tempRes = /(?<= select =)(〜d+(。 d)*)/ g.exec(urls);
返回tempRes?tempRes [0] .split(','):[]
}

正则里写的是啥意思啊,好炫,看不懂

叶落知秋 2022-05-04 13:55:29

这么写好搓啊,高级的不会,哈哈哈

/*url有三种情况
      https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=&local_province_id=33
      https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=800&local_province_id=33
      https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=800,700&local_province_id=33
      匹配elective后的数字输出(写出你认为的最优解法):
      [] || ['800'] || ['800','700']*/
      let url =
        'https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=22,44&local_province_id=33'
      function getElective(url, key) {
        let str = url.slice(url.indexOf(key) + ++key.length)
        let res = str.indexOf('&') > -1 ? str.split('&')[0] : str
        if (res === '') return []
        return res.indexOf(',') > -1 ? res.split(',') : [res]
      }
      let res = getElective(url, 'elective')
      console.log(res)
奶气 2022-05-04 13:55:29

有没有大佬解释下第一位给的正则啊?看不懂呀

有没有大佬解释下第一位给的正则啊?看不懂呀
(/(?<=elective=)(d+(,d+))/)
其中:(?<=elective=) 是指匹配以elective=开头的字符串;
(d+(, d+)
)指匹配数字开头,可能不定数量逗号分隔后是数字的字符串。

兔姬 2022-05-04 13:55:29
function getUrlValue(url, targetKey) {
    if (!url || !targetKey) return []

    let reg = new RegExp(`&?${targetKey}=(\d*,?)*&?`)
    let matchStr = reg.exec(url)
    let val = matchStr.length && matchStr[0].replace(/&/g,'').split('=').length >= 2 ? matchStr[0].replace(/&/g,'').split('=')[1] : ''
    return val ? val.split(',') : []
}
无可置疑。 2022-05-04 13:55:29

用Url对象是开挂了。其实还可以创建a标签直接搞,也是类似Url对象的效果。用原始的正则也很简单

function getQueryFromUrl(key, url) {
  const matches = url.match(new RegExp(`(\?|&)${key}=([^&]*)(&|$)`));
  return !matches ? [] : matches[2].split(',');
}

getQueryFromUrl('elective' , 'https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=800,700&local_province_id=33')
手长情犹 2022-05-04 13:55:29
function getQueryParam(queryString) { // 默认必有elective字段
  const electiveString  = queryString
    .split("&")
    .filter(str => str.includes('elective='))[0]
  const result  = electiveString
    .split("=")[1] // value
    .split(',') 
    .filter(item => item) 
  return result 
}
牛↙奶布丁 2022-05-04 13:55:29
// 匹配url后面的关于某字段的值
export async function getUrlParam(url = "", param = "") {
  let result = "";

  // 比如取得"name"这个字段的参数
  if (!url || !param) {
    return "";
  }

  // 方法一 result = new URLSearchParams(url).get(param); // 内置api方法实现

  // 方法二
  let _a =
    url.split("?").length > 1
      ? url
          .replace("?", "?&")
          .split("?")
          .join()
          .replace(/&/g, "&&&")
          .split("&&")
      : [url]; // 这里取数组第一个参数后的内容
  _a.length > 1 ? (_a = _a.slice(1)) : (_a = []);
  _a.forEach(item => {
    if (item.indexOf(param + "=") > -1) {
      result = item.split("=")[1];
    }
  });
  return result.split(",").length === 1 ?  (result.split(",")[0] === "" ? [] :  result.split(",")) :  result.split(",");
}
雾里花i 2022-05-04 13:55:29

var getParams=function(url,{data='elective'}={}){
let params = url.split(data+'=')[1];
if(params == undefined) return undefined;
let val = params.split('&')[0];
return val==''?[]:val.split(',');
}

蓝戈者 2022-05-04 13:55:29

function getword(url,word){
var test =new RegExp(word+'=([^&]*)(&|$)');
var ele = url.match(test)[1];
return ele?ele.split(","):[];
}
啥是大厂,没进去过。可能有以下需求:
1.可以扩展换url,换字段;
2.要快;
3.还得防止各种报错

梦幻之岛 2022-05-04 13:55:29
 let ur =  new URLSearchParams('https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=800,700&local_province_id=33').get('elective')

这个很厉害,有又学到一招

这个正则表达式

function getUrlValue(url){
    if(!url) return;
    let res = url.match(/(?<=elective=)(d+(,d+)*)/);
    return res ?res[0].split(',') : [];
}

这个正则表达式<=是零宽度断言的写法,断言 elective=有无内容,是匹配elective=的字符的

美煞众生 2022-05-04 13:55:29

const getUrlValue = (url, key) => {
const reg = new RegExp((?<=${key}=)([^&]*)(?=&));
const result = url.match(reg);
return result ? result[1] : result;
}

喵星人汪星人 2022-05-04 13:55:29

get了,URLSearchParams这个API是好API

桃气十足 2022-05-04 13:55:21
 new URLSearchParams('https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=800,700&local_province_id=33').get('elective')

IE浏览器不支持呀

汹涌人海 2022-05-04 13:55:19

function trans(str){
let arr = str.split("?")[1].split("&");
for(let i = 0 ; i< arr.length; i++){
if(arr[i].split("=")[0]==="elective"){
target = arr[i].split("=")[1];
}
}
return target.split(",");
}

仅冇旳回忆 2022-05-04 13:55:15

可惜啊,大部分公司要兼容到ie11

屏幕快照 2019-07-15 上午11 16 05

左岸枫 2022-05-04 13:55:12

模仿第一位大佬的做法
var getUrlValue = function (urls) {
if (!urls) return;
let tempRes = /(?<=elective=)(d+(.d)*)/g.exec(urls);
return tempRes ? tempRes[0].split(',') : []
}

鹤仙姿 2022-05-04 13:55:04

`
function searchParams(url) {
const searchParams = new URLSearchParams(url)
const getElective = searchParams.get('elective')

if(getElective) {
	return getElective.split(',').filter(item => item)
} else {
	return []
}

}
searchParams('https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=&local_province_id=33') // []
searchParams('https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=800&local_province_id=33') // ["800"]
searchParams('https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=800,700&local_province_id=33') // ["800","700"]
`

浅语花开 2022-05-04 13:54:57

const urls = [
"https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=&local_province_id=33",
"https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=800&local_province_id=33",
"https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=800,700&local_province_id=33",
];
urls.forEach(url => {
console.log(new URLSearchParams(url).get('elective').split(','));
});

闻呓 2022-05-04 13:54:51
function searchParams(url) {
	const searchParams = new URLSearchParams(url)
	const getElective = searchParams.get('elective')

	if(getElective) {
		return getElective.split(',').filter(item => item)
	} else {
		return []
	}
}
searchParams('https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=&local_province_id=33') // []
searchParams('https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=800&local_province_id=33') // ["800"]
searchParams('https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=800,700&local_province_id=33') // ["800","700"]
稀香 2022-05-04 13:54:24

江湖正好 2022-05-04 13:54:15

new URL
("https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=700,800&local_province_id=33")
.searchParams.get("elective")
.split(",")
.filter(e=>e)
.map(e=>e)

这个俗人 2022-05-04 13:52:53
 new URLSearchParams('https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=800,700&local_province_id=33').get('elective')
混浊又暗下来 2022-05-04 13:51:08

考虑到是大厂级别的前端要求,有这么几点:
1,elective是跟在一堆空值后面,所以要效率最高的排除掉前面的匹配。
2,在匹配完elective的值之后,&后面的匹配就需要立刻停止,停止性能消耗
3,第三个的值中带了逗号,也要考虑其他符号的可能性。

孤芳又自赏 2022-05-04 13:45:54
const urls = [
  "https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=&local_province_id=33",
  "https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=800&local_province_id=33",
  "https://www.xx.cn/api?keyword=&level1=&local_batch_id=&elective=800,700&local_province_id=33",
];

function getElective(url) {
  const reg = new RegExp("(^|&)elective=([^&]*)(&|$)", "i");
  const r = url.substr(1).match(reg);

  if (r != null) {
    return r[2] ? r[2].split(",") : [];
  }

  return [];
}

urls.forEach((url) => {
  const result = getElective(url);
  console.log(result, "---result");
});
尐籹人 2022-05-03 10:17:42
function getUrlValue(url){
    if(!url) return;
    let res = url.match(/(?<=elective=)(d+(,d+)*)/);
    return res ?res[0].split(',') : [];
}
~没有更多了~

关于作者

0 文章
0 评论
23 人气
更多

推荐作者

巷子口的你

文章 0 评论 0

微信用户

文章 0 评论 0

神妖

文章 0 评论 0

7460852697

文章 0 评论 0

ligengkai

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文