【发布时间】:2017-03-16 18:17:21
【问题描述】:
我正在尝试制作一个从报告文件中提取数据的正则表达式字符串。棘手的部分是我需要这个单一的正则表达式字符串来匹配多种报告文件内容格式。即使找不到某些可选组,我也希望正则表达式始终匹配。
获取以下报告文件内容(注意:#2 缺少“val2”部分。):
- 文件 #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(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 组始终为空。
结论:行为似乎是,即使存在可选组,正则表达式也会优先考虑空组值而不是当前值。有没有办法在可选组存在时强制获取它们的值,并且只在它们不存在时返回(空)?
注意:我使用的是最新的 .NET 框架,代码将移植到 Java(Android)。我试图避免使用多个操作来解决性能和带宽问题。
有人可以帮我解决这个问题吗?
【问题讨论】:
-
您认为将第三个值设为可选对您来说也是一种有效的方法吗?看看
-val1-(?<val1>.+?)(-val2-(?<val2>.+?))?(-val3-(?<val3>.+?))?-。 -
在 C# 中,在我运行的测试程序中,Regex #5 适用于 file1 和 file2。这不是你得到的吗?
-
原来我的简化示例不够现实。这是一个更好的(基于html内容提取):regex101.com/r/jY4jK1/2;我将最后 3 个组设置为可选,结果是它们没有被提取,知道如何让它工作吗?
-
您要求正则表达式引擎关心匹配的数据,但它没有足够的信息知道它需要关心。您几乎肯定需要切换到使用 HTML 解析,然后可能将正则表达式与文档树查询结合使用。
-
我试图在一个进程中一次提取所有信息,但我认为 XPaths 可能更灵活、更安全。让我们希望使用这种技术逐个提取信息不会拖累性能! :-) 感谢您的帮助!
标签: regex optional regex-group