请教一个 JavaScript 的正则问题

2014-04-15 11:37:43 +08:00
 ibudao
Str='we Name: ects\nYou Name: deee'
期望输出: ['ects, 'deee']
由于JS不支持零宽后顾断言,这个地方我用分组:
`Str.match(/(Name:\s*([a-z]+\b)\2)/g);`
但是输出是`null`,换用不捕获的分组写法:
`Str.match(/(?:Name:\s*)[a-z]+\b/g);`,也不是我想要的输出。
我是在nodejs上跑的,求大神指导!
4746 次点击
所在节点    Node.js
21 条回复
s
2014-04-15 11:50:58 +08:00
var ans=[];
str.replace(/Name:\s*([a-z]+)\b/g, function(_, name){
ans.push(name);
});
muzuiget
2014-04-15 11:54:43 +08:00
为什么要纠结一条正则,先 split('\n') 然后分两次提取不就好了吗?
kfll
2014-04-15 12:06:11 +08:00
ibudao
2014-04-15 12:24:49 +08:00
@muzuiget 其实这里我不太明白的是,为什么通过\N来提取第N个捕获为啥不生效。。
khowarizmi
2014-04-15 12:25:24 +08:00
lss +1
ibudao
2014-04-15 12:25:43 +08:00
@s 我表示我长姿势了,OTZ!!
ibudao
2014-04-15 12:28:24 +08:00
@khowarizmi 恩,那个貌似是正解,不过只能这样曲折了吗。。
jakwings
2014-04-15 12:44:04 +08:00
1 楼的代码差不多了。假如是经常出现这种需求的话,干脆用 YAML 函数库,或者自己写一个简化版通用函数好了。
exoticknight
2014-04-15 12:46:04 +08:00
捕获分组其实是可以的,你只要取[1]分组就可以了
ibudao
2014-04-15 12:49:32 +08:00
@exoticknight 针对我这个情况,那[1]取分组如何写?
rubyking
2014-04-15 15:27:44 +08:00
Str.match(/\w+$/mg);
ibudao
2014-04-15 15:33:18 +08:00
实际上我的源string是这样的:
Available Android Virtual Devices:
Name: test
Path: /home/kingbo/.android/avd/test.avd
Target: Android 4.4 (API level 19)
ABI: armeabi-v7a
Skin: WVGA800
---------
Name: ects
Path: /home/kingbo/.android/avd/ects.avd
Target: Android 4.4 (API level 19)
ABI: armeabi-v7a
Skin: WVGA800
ibudao
2014-04-15 15:34:01 +08:00
@rubyking 见上楼
xu33
2014-04-15 19:22:25 +08:00
使用regexp对象
switch
2014-04-15 21:21:51 +08:00
可以先使用 match 提取出 Name: xxx 后再使用 replace 替换掉 Name: ,如:
```
Str.match(/Name:\s*(\w+)/g) || []).map(function (str) {
return str.replace(/Name:\s*/, "");
}
```
match 方法的正则里如果有 g(全局匹配)则分组引用无效了。
shiye515
2014-04-16 12:01:02 +08:00
Str.match(/(: *).*(?=($|\n))/g).map(function(v){return v.replace(/: */,'')}),现学现卖,参考http://deerchao.net/tutorials/regex/regex.htm , http://www.cnblogs.com/rubylouvre/archive/2010/03/09/1681222.html ,javascript不支持后瞻,要不后面的map都可以省了
shiye515
2014-04-16 12:05:24 +08:00
@rubyking 这个匹配简洁明了
shiye515
2014-04-16 12:14:08 +08:00
请原谅我回帖不看之前的回复 `Str.match(/(Name: *).*(?=($|\n))/g).map(function(v){return v.replace(/Name: */,'')}) `这个应该符合要求
ibudao
2014-04-16 12:27:51 +08:00
@shiye515 谢谢分享。貌似js不支持后顾,这个需求就没法一个匹配搞定了
s
2014-04-16 17:15:27 +08:00
Str.match(/[^:]+$/mg);

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

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

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

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

© 2021 V2EX