【问题标题】:Regex to return different parts if starts with specific string如果以特定字符串开头,则正则表达式返回不同的部分
【发布时间】:2015-11-27 17:46:21
【问题描述】:

我正在尝试使用正则表达式从字符串中返回一个值,如果它以“P0000000S”开头,但如果不是,则返回另一个值。

例如:

我有这个字符串

P0000000S521500500015 1TZ003B 3090942 04260

结果:3090942

因为它以 P0000000S 开头,所以它应该返回这个结果:3090942

但是这个

P3417677S521500500015 1TZ003B 3090942 04260

结果:3419677

应该返回第一个 P 到 S: 3417677 之间的数字

在阅读和调查后,我想出了这个正则表达式:

(?(?=^P0000000S)^.{29}\s(\w+)\s.{5}$|^P(\d+).{35})

根据我测试它的这个网站,它正在工作

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

好吧,我正在尝试在我正在创建的 C# APS.NET 网站上使用它,但它不起作用,我需要澄清我需要在 Regex 上执行 IF-THEN-ELSE 逻辑,因为这是许多其他验证器之一的验证器,并且所有其他验证器都在工作。 如果有任何帮助,我将它与 Regex.Match 函数一起使用,然后循环生成的组。

谢谢。

【问题讨论】:

  • 对这种逻辑使用正则表达式绝对是错误的工作工具(即使它是可能的)。只需编写一个简单的函数来标记输入并确定(根据您的规则)返回哪个部分。它会花费更少的时间来编写,更具可读性并且更易于维护。
  • 旁注:IF 语句是多余的。因为如果第一次前瞻失败(?=,那么它将采用 OR 之后的模式。
  • 我知道使用函数更容易,但此验证是针对我工作的生产线上的扫描,它是唯一有条件的线,所有其他线都使用正则表达式从不同格式的字符串中提取零件号和序列号。这些正则表达式被放在一个数据库中,该数据库读取适当的验证字符串。

标签: c# asp.net regex


【解决方案1】:

对环视使用两种不同的条件:

var regex = new Regex(@"(?<=P0000000S\w+\s\w+\s)\w+|(?<=P)\d+(?=S)");

您只需要过滤结果不是 0000000。

【讨论】:

  • 这对我有用,尽管我将使用其他答案,因为应用程序上已经实现的代码使用 group[0] 上的原始字符串来验证扫描,但我没有提到这是原始问题,非常感谢
【解决方案2】:

只需使用两个不同的正则表达式,如果第一个不匹配,则失败。

static string PartImInterestedIn(string input)
{
    Match match;
    match = Regex.Match(input, @"(?=^P0000000S)\S+ \S+ (\S+)");
    if (!match.Success)
    {
        match = Regex.Match(input, @"^P(\d+)S");
    }

    return match.Groups[1].Value;
}

【讨论】:

  • 正如我所提到的,我无法对 C# 代码进行验证,因为这是一个使用正则表达式字符串进行验证的已在使用的系统,但问题是这是他们拥有2 个不同的可能位置上的零件编号,但无论如何感谢您的支持。
猜你喜欢
  • 1970-01-01
  • 2017-09-17
  • 2014-10-28
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 2011-09-16
相关资源
最近更新 更多