强制解析可选组
Force parsing optional groups
我正在尝试制作一个从报告文件中提取数据的正则表达式字符串。棘手的部分是我需要这个单一的正则表达式字符串来匹配多个报告文件内容格式。我希望正则表达式始终匹配,即使找不到某些可选组。
取以下报告文件内容(注意:#2缺少"val2"部分。):
- File #1: "-val1-test-val2-result-val3-done-"
- Expected Result:
- Val1 Group: test
- Val2 Group: result
- Val3 Group: done
- File #2: "-val1-test-val3-done-"
- Expected Result:
- Val1 Group: test
- Val2 Group: (empty)
- Val3 Group: done
我尝试了以下正则表达式字符串:
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 组始终为空。
结论:行为似乎是即使存在可选组,正则表达式也会优先考虑空组值而不是当前值。有没有办法在可选组存在时强制获取它们的值,而在它们不存在时仅获取 return(空)?
注意:我使用的是最新的 .NET 框架,代码将移植到 Java(Android)。我试图避免使用多个操作来解决性能和带宽问题。
有人可以帮我解决这个问题吗?
如果我们做一些假设是可能的:
- 值可能会丢失,但它们的顺序始终相同
- 第一个值始终存在
- 我们要找的部分前后都有分隔符
-val1-([^-]+)(?:-val2-([^-]+)|)(?:-val3-([^-]+)|)-
我正在尝试制作一个从报告文件中提取数据的正则表达式字符串。棘手的部分是我需要这个单一的正则表达式字符串来匹配多个报告文件内容格式。我希望正则表达式始终匹配,即使找不到某些可选组。
取以下报告文件内容(注意:#2缺少"val2"部分。):
- File #1: "-val1-test-val2-result-val3-done-"
- Expected Result:
- Val1 Group: test
- Val2 Group: result
- Val3 Group: done
- File #2: "-val1-test-val3-done-"
- Expected Result:
- Val1 Group: test
- Val2 Group: (empty)
- Val3 Group: done
我尝试了以下正则表达式字符串:
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 组始终为空。
结论:行为似乎是即使存在可选组,正则表达式也会优先考虑空组值而不是当前值。有没有办法在可选组存在时强制获取它们的值,而在它们不存在时仅获取 return(空)?
注意:我使用的是最新的 .NET 框架,代码将移植到 Java(Android)。我试图避免使用多个操作来解决性能和带宽问题。
有人可以帮我解决这个问题吗?
如果我们做一些假设是可能的:
- 值可能会丢失,但它们的顺序始终相同
- 第一个值始终存在
- 我们要找的部分前后都有分隔符
-val1-([^-]+)(?:-val2-([^-]+)|)(?:-val3-([^-]+)|)-