强制解析可选组

时间:2015-08-02 13:37:27

标签: regex optional regex-group

我试图制作一个从报告文件中提取数据的正则表达式字符串。棘手的部分是我需要这个单一的正则表达式字符串来匹配多个报告文件内容格式。即使找不到某些可选组,我希望正则表达式始终匹配。

获取以下报告文件内容(注意:#2缺少" val2"部分。):

  
      
  • 文件#1:" -val1-test-val2-result-val3-done - "      
        
    • 预期结果:      
          
      • Val1组:测试
      •   
      • Val2组:结果
      •   
      • Val3 Group:已完成
      •   
    •   
  •   
  • 文件#2:" -val1-test-val3-done - "      
        
    • 预期结果:      
          
      • Val1组:测试
      •   
      • Val2组:(空)
      •   
      • Val3 Group:已完成
      •   
    •   
  •   

我尝试了以下正则表达式字符串:

Regex #1(Normal): "-val1-(?<val1>.+?)-val2-(?<val2>.+?)-val3-(?<val3>.+?)-"

问题:文件#1工作正常,但在文件#2上,正则表达式不匹配,因此我没有任何组值。

Regex #2(Non greedy)): "-val1-(?<val1>.+?)(-val2-(?<val2>.+?))?-val3-(?<val3>.+?)-"
Regex #3(Boolean OR): "-val1-(?<val1>.+?)(-val2-(?<val2>.+?)|(.*?))-val3-(?<val3>.+?)-"
Regex #4(Conditionnal): "-val1-(?<val1>.+?)(?(-val2-(?<val2>.+?))|(.+?))-val3-(?<val3>.+?)-"
Regex #5(Conditionnal): "-val1-(?<val1>.+?)(?(-val2-(?<val2>.+?))(-val2-(?<val2>.+?)))-val3-(?<val3>.+?)-"
Regex #6(Conditionnal): "-val1-(?<val1>.+?)(?(-val2-(?<val2>.+?))(-val2-(?<val2>.+?))|(.+?))-val3-(?<val3>.+?)-"

问题:文件#2按预期工作,但文件#1的val2组始终为空。

结论:行为似乎是即使存在可选组,正则表达式也会将空组值优先于当前值。有没有办法强制获得可选组&#39;它们存在时的值,只有当它们不存在时返回(空)?

注意:我使用的是最新的.NET框架,代码将移植到Java(Android)。我试图避免使用多个操作来解决性能和带宽问题。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

如果我们做出一些假设是可能的:

  1. 值可能会丢失,但它们的顺序始终相同
  2. 第一个值始终存在
  3. 我们正在寻找的部分之前和之后都有一个分隔符
  4. -val1-([^-]+)(?:-val2-([^-]+)|)(?:-val3-([^-]+)|)-
    

    https://regex101.com/r/yY6vF9/1