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 正则表达式逗号分隔文本的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配逗号分隔的数字与可选的小数部分

正则表达式逗号分隔分隔符

优化逗号分隔值正则表达式

C# 正则表达式在 外用逗号分隔

逗号分隔的列表正则表达式 [重复]

通过正则表达式获取逗号分隔的数字