求个 js 正则,脑子最近进水,暂时想不出来

2020-07-04 23:09:04 +08:00
 supermoonie

输入如下: Content-Disposition: form-data; name="test.png"; filename="test.jpg" 或 Content-Disposition: form-data; name="foo"

输出: ['test.png', 'test.jpg'] 或 ['foo']

哪位大佬指导下?[献花][献花][献花]

3536 次点击
所在节点    JavaScript
45 条回复
creanme
2020-07-04 23:18:38 +08:00
手机回复的,也没测试,就当瞎写的。
name=(".*\.png");filename=(".*\.jpg")

用$1 与$2 输出
mingl0280
2020-07-04 23:20:54 +08:00
(\")(\S+)(\")取第二组。
mingl0280
2020-07-04 23:21:31 +08:00
https://regex101.com/
这个网站可以直接测试正则,挺好用的。
aheadin
2020-07-04 23:25:27 +08:00
function(str) {
return [...str.matchAll(/name="([\w+.]+)"/g)].map(item => item[1])
}
supermoonie
2020-07-04 23:28:53 +08:00
@mingl0280 /(?:")(\S+)(?:")/.exec('Content-Disposition: form-data; name="test.png"; filename="test.jpg"') 稍微改了下,返回的是 [""test.png"", "test.jpg"],第一个多了双引号。。。
supermoonie
2020-07-04 23:33:06 +08:00
@aheadin niubility,大佬能一个正则匹配出来吗?
supermoonie
2020-07-04 23:34:02 +08:00
@creanme 第二种情况满足不了😂
ochatokori
2020-07-04 23:45:02 +08:00
js 的正则最简单了,挖空填入(.*?)就好了
```javascript
text.match(/name="(.*?)"(.*?)filename="(.*?)"/)
// 取数组的 1 和 3
如果想第二种情况节 /name="(.*?)"/
```
autoxbc
2020-07-04 23:45:50 +08:00
正则就是圣杯,不管什么问题搞成正则就对了 <-- 害人不浅
sedgwickz
2020-07-04 23:47:06 +08:00
'Content-Disposition: form-data; name="test.png"; filename="test.jpg" 或 Content-Disposition: form-data; name="foo"'.match(/(?<=(name\="|filename\=")).*?(?=")/g)
supermoonie
2020-07-04 23:47:53 +08:00
@ochatokori 分开写,我也会😂,我在尝试一个正则怎么给取出来,貌似有点难。。。
lidlesseye11
2020-07-04 23:50:35 +08:00
。。。你这个需求不就是取引号里的东西吗?
supermoonie
2020-07-04 23:50:50 +08:00
@sedgwickz niubility,大佬一出手就知有没有
supermoonie
2020-07-04 23:53:44 +08:00
@lidlesseye11 是的呢,目前只看到一位大佬写出来了,小弟反正是写不出来😂
lidlesseye11
2020-07-05 00:11:43 +08:00
@supermoonie
那 split 比较简单粗暴吧。。
function getName(str) {
var arr = str.split("\"");
var rtnArr = new Array();
for(var i = 0;i < arr.length; i++) {
if (i%2!=0) rtnArr.push(arr[i]);
}
return rtnArr;
}
supermoonie
2020-07-05 00:23:12 +08:00
@lidlesseye11 你不觉得 /(?<=(name="|filename=")).*?(?=")/g 这个正则很完美吗?( emmm... 主要是项目是自己的,所以自己能看懂就行了,虽然我知道 split 更直接更易读,但是一旦有了想用正则去做,就会不死不休😂)
mingl0280
2020-07-05 00:27:07 +08:00
@supermoonie 正则匹配下来应该是个 iterator 啊,你在想啥
```
var str = 'Content-Disposition: form-data; name="test.png"; filename="test.jpg"'
var matches = str.matchAll(/(")(\S+)(")/g)
for(const match of matches)
{
console.log(`${match[2]}`)
}
```
xiaoming1992
2020-07-05 00:29:31 +08:00
const str = ""

const reg = /(?<=name=\")(.+?)(?=\")/g

let exec = reg.exec(str)

const resultArray = []

while (exec) {

__resultArray.push(exec[0])

__reg.exec(str)

}
supermoonie
2020-07-05 00:33:40 +08:00
@mingl0280 想的是一行代码搞定,有就返回['test.png', 'test.jpg'] 或者 ['foo'] ,没有就返回 null,/(?<=(name="|filename=")).*?(?="\s+)/g 这个正则不是更香吗?
supermoonie
2020-07-05 00:34:09 +08:00
@xiaoming1992 谢了,前面有位大佬提供了 /(?<=(name="|filename=")).*?(?="\s+)/g

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/687210

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX