regex - 强制解析可选组

标签 regex option-type regex-group

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

获取以下报告文件内容(注意:#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)。出于性能和带宽方面的考虑,我尽量避免使用多个操作。

有人可以帮我解决这个问题吗?

最佳答案

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

  1. 值可能会丢失,但它们的顺序始终相同
  2. 第一个值始终存在
  3. 我们要找的部分前后都有分隔符

-val1-([^-]+)(?:-val2-([^-]+)|)(?:-val3-([^-]+)|)-

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

关于regex - 强制解析可选组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31772440/

相关文章:

包含子正则表达式的 Javascript 复合正则表达式

php - PHP 中的未知修饰符 '/' 错误

快速增量 Int!不工作

javascript - 使用正则表达式检查可选字符集

java - 将替换字符串中的所有字符串替换为正则表达式?

python - 读取文件直到python中的特定行

java - 使用 isPresent() 从 Optional 内部获取值

c++ - 脱离的 std::optional<T> 对象的散列是什么?

JavaScript RegEx 集团

用于匹配和选择特定 URL 的正则表达式