当前位置: 首页 > 知识库问答 >
问题:

强制解析可选组

孙佑运
2023-03-14

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

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

  • 文件#1:“-val1-test-val2-的结果-val3-做-”
  • 预期结果:
    • Val1组:测试
    • Val2组:结果
    • Val3组:完成
      < li >预期结果: < ul > < li>Val1组:测试 < li>Val2组:(空) < li>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个答案

朱鸿畅
2023-03-14

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

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

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

 类似资料:
  • 因此,在AWS控制台中设置了实际的秘密之后,我需要触发Lambda函数的重新部署,以便新的秘密值将由CloudFormation解析并在函数的环境中设置。我该怎么做? 执行失败,消息为:没有要部署的更改。 我怀疑CloudFormation正在将模板的“原始”版本与上次部署的版本进行比较,而没有首先解析对Secrets Manager的引用。是这样吗?有没有什么诀窍可以迫使更早地取消交易? 脚注:

  • 和标题差不多。我在请求正文中有一个可选对象。但是,如果给定了该对象,则它必须包含几个子属性。 我的OpenAPI组件配置如下所示: 我正在使用express openapi validator来验证这一点。现在,我不明白这是否是express openapi validator包的问题,但可选字段(partner)的必填字段(名称、电话)从未验证过。我可以只提供合作伙伴:{},然后直接插入,或者甚

  • 我想创建一个正则表达式,其中包含必须包含在字符串中的组和仅可选的组。我为此使用c#。 我的目标字符串如下所示 我有以下要求: ##开头和结尾是强制性的(但这不一定是行的开头或结尾) ##和#(或##)之间的字符串也是强制性的 E{数字}或E-{数字}是可选的 到目前为止我已经想出了 = = 你能帮我创建一个适合我要求的正则表达式吗?

  • 我希望我可以检查并将可选的内容转换为另一个类或拥有一个空对象,而不是编写自己的方法或类。 对于应用程序中的这个子问题,我希望将树节点实例的自定义用户对象转换为自定义用户对象,前提是树节点是默认可变树节点的实例。 我记得我需要经常以这种方式播放可选或流。它不流利。实际上,我希望java Optional或Stream有一个执行上述步骤的cast方法。我不想编写自己的fluent CustomOpti

  • 我需要将日期时间解析为两种不同格式的字符串: 19861221235959Z 1986-12-21T23:59:59Z 以下dateTimeForware模式正确解析第一种日期字符串 但是第二个失败了,因为破折号、冒号和T不是预期的。 我尝试使用以下可选部分: 出乎意料的是,这会解析第二种日期字符串(带破折号的),而不是第一种,抛出一个 这就好像可选部分没有被评估为可选的。。。