Javascript 正则表达式逗号分隔文本
Posted
技术标签:
【中文标题】Javascript 正则表达式逗号分隔文本【英文标题】:Javascript Regex comma separated text 【发布时间】:2017-02-02 05:59:40 【问题描述】:我有这个字符串:
remote:City|Vestavia Hills,AL,remote:Citystate|Vestavia Hills,395b5231539390675a7abe0751fc4820,remote:City|Vestavia Hills,AL,remote:Citystate|Vestavia Hills,395b5231539390675a7abe0751fc4820
我想匹配并提取用逗号分隔的字符串。
结果应该是:
MATCH 1
'remote:City|Vestavia Hills,AL'
MATCH 2
'remote:Citystate|Vestavia Hills'
MATCH 3
'395b5231539390675a7abe0751fc4820'
MATCH 4
'remote:City|Vestavia Hills,AL'
MATCH 5
'remote:Citystate|Vestavia Hills'
MATCH 6
'395b5231539390675a7abe0751fc4820'
我有这个正则表达式:
(remote:[a-zA-Z]+\|[^\,]+|[a-f0-9]32)
但是那些状态为“AL”的城市(用逗号分隔)被错误地分隔。
可能的解决方案:
我正在考虑做这样的事情 - remote:[a-zA-Z]+\|.*
- 并以逗号结束匹配,它后面有自己 (remote:[a-zA-Z]+\|.*
) 或 md5 哈希 ([a-f0-9]32,?
)。
这是我的正则表达式测试器链接:
https://regex101.com/r/rP8iJ2/1
【问题讨论】:
试试line.split(",")
,而不是正则表达式。相信我,用正则表达式解析 CSV 是不值得的
@vlaz 它不会产生我想要的结果.. 它会输出 remote:City|Vestavia Hills 和 AL 作为两个不同的结果
【参考方案1】:
使用单个正则表达式,您可以执行以下操作;
var str = "remote:City|Vestavia Hills,AL,remote:Citystate|Vestavia Hills,395b5231539390675a7abe0751fc4820,remote:City|Vestavia Hills,AL,remote:Citystate|Vestavia Hills,395b5231539390675a7abe0751fc4820",
arr = str.match(/(r.+?|[\da-f]32)(?=,?(remote|[\da-f]32|$))/g);
console.log(arr);
【讨论】:
杰作!完全基于我的想法:P @mwebber 我很高兴能得到帮助:)【参考方案2】:([a-f0-9]32|remote:[^|]+\|[^,]+(?:,[A-Z]2)?),?
这个比较容易理解,我给组做了一个特殊的可选后缀,而不是逗号后面只能是2个大写字母。
https://regex101.com/r/rP8iJ2/3
【讨论】:
【参考方案3】:您可以将您的正则表达式微调为这个基于前瞻的正则表达式:
/(?:^|,)(.+?(?=,(?:[a-f0-9]32|remote:)|$))/igm
这将按照您的预期提供 6 个捕获的组。
Updated RegEx Demo
(?:^|,) # Match line start or comma
( # captured group #1 start
.+? # match 1 or more of any character (lazy)
(?= # lookahead start
, # match comma followed by
(?: # non-capturing group start
[a-f0-9]32 # match hex digit 32 times
| # OR
remote: # match literal "remote:"
) # non-capturing group end
| # OR
$ # line end
) # looakehad end
) # capturing group #1 end
【讨论】:
最后一个问题,为什么会产生 -["remote:City|Vestavia Hills,AL", ",remote:Citystate|Vestavia Hills", ",395b5231539390675a7abe0751fc4820", ",remote:City|Vestavia Hills,AL", ",remote:Citystate|Vestavia Hills", ",395b5231539390675a7abe0751fc4820"]
(其中一些以逗号开头?)
如果您在while
循环中使用exec
并抓取捕获的组#1,那么它将没有逗号开头。甚至 regex101 演示链接也生成了该 JS 代码。【参考方案4】:
一种选择是使用 javascript 的拆分:
var str = "remote:City|Vestavia Hills,AL,remote:Citystate|Vestavia Hills,395b5231539390675a7abe0751fc4820,remote:City|Vestavia Hills,AL,remote:Citystate|Vestavia Hills,395b5231539390675a7abe0751fc4820";
var aux = str.split("remote");
var res = [];
for (var i=1 ; i < aux.length ; i++)
res.push("remote" + aux[i]);
;
console.log(res);
【讨论】:
没有产生我想要的结果以上是关于Javascript 正则表达式逗号分隔文本的主要内容,如果未能解决你的问题,请参考以下文章