【问题标题】:Regex comma separated sub string within a string正则表达式逗号分隔字符串中的子字符串
【发布时间】:2020-02-18 22:24:35
【问题描述】:

我需要使用正则表达式从字符串中获取键值对。

字符串类似于

country=xxx,state=yyy,city=zzz,

然后这个正则表达式

([^,=]+?)(=)([^,=]+?),

给我 3 个不同的键值对,但如果我有多个逗号分隔的值,则只选择第一个。

例如

country=xxx,state=yyy,city=zzz,pqr,

那么对于城市pqr 被删除。我想同时拥有城市的zzz,pqr

【问题讨论】:

  • 如果末尾应该有逗号,请尝试([^,=\n]+?)(=)([^,=\n]+(?:,[^,=\n]+)*), regex101.com/r/srQPam/1
  • (\w+)=(.*?)(?=,(?:\w+=|$)) - demo.
  • 也许是这个(?:[^,=]+?)=(([^\n](?!=))+),
  • 您是否致力于该输入格式?这非常可怕——逗号分隔对,除非它分隔值。哎呀!

标签: regex


【解决方案1】:

那么你不能在那些 to-be-avoided 字符中加逗号,对吗?

([^,=]+)(=)([^=]+),

【讨论】:

  • ([^,=]+)=([^=]+), 如果你不想捕获那个=
【解决方案2】:

如果您不想允许连续的逗号,,,您可以重复匹配逗号后跟除,= 之外的任何字符

如果你不想换行,你可以 ddd \r\n 到字符类。

([^,=]+)=([^,=]+(?:,[^,=]+)*),
  • ([^,=]+) 捕获 b,匹配除 ,= 之外的任何字符
  • = 字面匹配
  • ( 捕获第 2 组
    • [^,=]+ 匹配除,= 之外的任何字符1+ 次
    • (?:,[^,=]+)* 重复 0+ 次匹配 , 后跟除 ,= 之外的任何字符
  • ),关闭第 2 组并匹配尾随 ,

Regex demo

注意你可以省略[^,=]+?之后的?以使其不贪心,因为否定字符类不能匹配([^,=]+?)(=)中的以下=

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多