像'一样拆分字符串;foo=bar#baz=qo\#ox#al\=pha=beta使用regexp

像'一样拆分字符串;foo=bar#baz=qo\#ox#al\=pha=beta使用regexp,regex,Regex,这里有一个快速的挑战。 以这个字符串foo=bar#baz=qo\#ox#al\=pha=beta为例,它由键-值对组成,键-值对之间用#分隔,键和值之间用“=”分隔,并使用正则表达式(perl、python、classic等)。如果在键或值中遇到字符#和=,则它们的前缀为\。 因此,结果应该是一个键/值表: KEY | VALUE foo | bar baz | qo#ox al=pha | beta 如果您的regexp(split或match)只在#字符处拆分它,您将

这里有一个快速的挑战。 以这个字符串
foo=bar#baz=qo\#ox#al\=pha=beta
为例,它由键-值对组成,键-值对之间用#分隔,键和值之间用“=”分隔,并使用正则表达式(perl、python、classic等)。如果在键或值中遇到字符#和=,则它们的前缀为\。 因此,结果应该是一个键/值表:

KEY    | VALUE
foo    |  bar
baz    | qo#ox
al=pha | beta
如果您的regexp(split或match)只在#字符处拆分它,您将获得100分。如果您能够一次性拆分=字符处的键和值,则可以额外获得50分


另外,使用令牌解析和向前或向后看来解决这个问题很简单,因此没有任何意义。

这是一个两步过程:

  • 拆分@“#”以获取键/值对列表
  • 循环键/值对字符串并在“=”处拆分;将标记放入字典或地图中
  • (编辑:在regexp上使用单引号,主要是为了防止StackOverflow认为#是注释字符)。

    在Python中:

    import re
    
    string = "foo=bar#baz=qo\#ox#al\=pha=beta"
    
    regx = re.compile('(?:(?<=\A)|(?<=#))((?:[^=]|(?<=\\\\)=)+)=((?:[^#]|(?<=\\\\)#)+)')
    
    print regx.findall(string)
    

    编辑


    毫无兴趣地回答:它不尊重措辞中表达的条件。

    表达式:
    ((?:\\\\.[^\\\=])+=((?:\\.[^\\\\\\\\\\\\]+)\\\\\\?”
    可以通过应用弗里德尔的“展开循环”技术(如:
    ([^\\\\\\\\\\\\\\\\]*(?:\\\\\.\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]*)*)===([^\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。否则答案很好+1@LHMathies我不懂perl,所以我不确定
    \\\
    中的含义是什么(?:\\\
    及其在
    [^\\=]中的含义
    。这是指字符
    “\'”
    还是转义符号?顺便问一下,你的表情在看过之后非常明显,但这是一个棘手的问题。@ridgerunner很好地引用了Friedl,我不知道他展开循环的技巧,目前我不明白,我还没有研究过。还有很多东西需要学习正则表达式中的nme@ridgerunner我不想让事情变得更难理解……此外,它不是严格等价的,因为我在那里有
    +
    ,而不是
    *
    (问题不是说是否允许空键或值)。此外,展开中嵌套的
    *
    s让我毛骨悚然,很难记住,因为它的起点匹配独特,所以效率更高。@Konrads感谢这些要点!它们出现在哪里,或者我可以花在什么上?显然,这可以一步完成,@LHmathies已经证明:)
    import re
    
    string = "foo=bar#baz=qo\#ox#al\=pha=beta"
    
    regx = re.compile('(?:(?<=\A)|(?<=#))((?:[^=]|(?<=\\\\)=)+)=((?:[^#]|(?<=\\\\)#)+)')
    
    print regx.findall(string)
    
    [('foo', 'bar'), ('baz', 'qo\\#ox'), ('al\\=pha', 'beta')]