【发布时间】: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 之后的模式。 -
我知道使用函数更容易,但此验证是针对我工作的生产线上的扫描,它是唯一有条件的线,所有其他线都使用正则表达式从不同格式的字符串中提取零件号和序列号。这些正则表达式被放在一个数据库中,该数据库读取适当的验证字符串。