我正在尝试制作一个从报告文件中提取数据的正则表达式字符串。棘手的部分是我需要这个单一的正则表达式字符串来匹配多个报告文件内容格式。我希望正则表达式始终匹配,即使未找到某些可选组也是如此。
获取以下报告文件内容(注意:#2 缺少“val2”部分。):
- File #1: "-val1-test-val2-result-val3-done-"
- 预期结果:
- Val1 组:测试
- Val2 组:结果
- Val3 组:完成
- 文件 #2:“-val1-test-val3-done-”
- 预期结果:
- Val1 组:测试
- Val2 组:(空)
- Val3 组:完成
- 预期结果:
我尝试了以下正则表达式字符串:
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(Conditional): "-val1-(?<val1>.+?)(?(-val2-(?<val2>.+?))|(.+?))-val3-(?<val3>.+?)-"
Regex #5(Conditional): "-val1-(?<val1>.+?)(?(-val2-(?<val2>.+?))(-val2-(?<val2>.+?)))-val3-(?<val3>.+?)-"
Regex #6(Conditional): "-val1-(?<val1>.+?)(?(-val2-(?<val2>.+?))(-val2-(?<val2>.+?))|(.+?))-val3-(?<val3>.+?)-"
问题:文件 #2 按预期工作,但文件 #1 的 val2 组始终为空。
结论:行为似乎是即使存在可选组,正则表达式也会优先考虑空组值而不是当前值。有没有办法在可选组存在时强制获取它们的值,而只在它们不存在时返回(空)?
注意:我使用的是最新的 .NET 框架,代码将移植到 Java(Android)。出于性能和带宽方面的考虑,我尽量避免使用多个操作。
有人可以帮我解决这个问题吗?
最佳答案
如果我们做一些假设是可能的:
- 值可能会丢失,但它们的顺序始终相同
- 第一个值始终存在
- 我们要找的部分前后都有分隔符
-val1-([^-]+)(?:-val2-([^-]+)|)(?:-val3-([^-]+)|)-
关于regex - 强制解析可选组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31772440/