有没有更好的方法来检查整个字符串是否匹配?

时间:2015-09-24 11:16:04

标签: c# regex

我逐行解析文本文件,对于每一行,我都有一个特殊的正则表达式。然而,在一种情况下,图案匹配两条线。一个是正​​确的匹配而另一个是仅仅是因为一些值是可选的。

无效匹配:

  

BNE1010 / 1000 HKG1955 / 2005 7 / PLD / CLD / YLD

匹配patial字符串(完全匹配):

  

BNE1010 / 1000

正确匹配(匹配整个字符串):

  

RG878A / 21AUG15 GIG / BOG 1 / RG / AV 3 / AV 4 / AV 5 / RG 6 / AV081C / 22 7 / CDC / YD 9 / TP

这方面的正则表达式很长,包含几个选项组:

^(?<FlightDesignator>([A-Z0-9]{2}[A-Z]?)([0-9]{3,4}))(?<OperationalSuffix>[A-Z])?(?<FlightIdentifierDate>\/(\d{2})([A-Z]{3})?(\d{2})?)?(\s(?<FlightLegsChangeIdentifier>(\/?[A-Z]{3})+)(?=(\s|$)))?(\s1(?<JointOperationAirlineDesignators>(\/.{2}[A-Z]?)+))?(\s3\/(?<AircraftOwner>([A-Z]{2}|.)))?(\s4\/(?<CockpitCrewEmployer>(.+?)(?=(?: \d\/|$))))?(\s5\/(?<CabinCrewEmployer>([A-Z]{2}|.)))?(?<OnwardFlight>\s6\/(([A-Z0-9]{2}[A-Z]?)([0-9]{3,4}))([A-Z])?(\/(\d{2})([A-Z]{3})?(\d{2})?)?)?(\s7\/(?<MealServiceNote>(\/?[A-Z]{0,3})+))?(\s9\/(?<OperatingAirlineDisclosure>(.{2}[A-Z]?)))?

我认为没有必要研究整个正则表达式,因为它在运行时从较小的模式动态构建,并且所有部分都能正常工作。还有许多组合使用单元测试进行测试,它们都可以工作......只要我尝试解析应该与模式匹配的行。

目前我正在检查整个字符串是否与

匹配
match.Group[0].Value == line

但我发现它很丑陋。我从JavaScript中知道正则表达式引擎提供了一个Index属性,其中正则表达式引擎停止了。所以我的想法是将索引与字符串的长度进行比较。不幸的是,我无法在C#找到这样的财产。

另一个想法是修改正则表达式,使其只匹配一行而不匹配部分行。

示例:https://regex101.com/r/dM5wU4/1

该示例仅包含两种情况,因为实际上没有任何组合会改变其行为。我可以删除一些参数,但它不会改变任何东西。

编辑:

我已编辑了我的问题。很抱歉每个人都没有在第一时间提供所有信息。在手机上写字时我不再问任何问题:)这不是一个好主意。希望它现在不会被关闭。

你问我是否可以简化正则表达式。如果可以的话,我会这样做,并知道如何。如果这很容易,我也不会问。问题开始时正则表达式字符串在开发期间变得更大。现在他们处于生产长度,即使为了问题我也无法缩短它们,抱歉。

EDIT-2:

我找到了无法找到Index类的继承LengthMatch属性的原因。

出于某些奇怪的原因选择Match类并按F1 Visual Studio打开了错误的帮助页面(Match Properties),即使我没有使用Micro Framework 。我没有注意到这一点,但我确实想知道为什么信息很少。感谢@Jamiec获取正确的链接。在点击F1时,我不再信任Visual Studio。

1 个答案:

答案 0 :(得分:1)

免责声明:我要加上这个,但我怀疑它的解决方案。如果不是这部分将被短期删除

您可以在正则表达式的末尾添加$。这将停止您的第一个示例匹配,但继续匹配第二个示例。

由于您未提供超过2个示例,因此不清楚这是否真正解决了您的所有案例或仅仅是一个特定的误报。

  

我的问题是,是否可以检查正则表达式是否与整个sting匹配,而不检查第一组是否与原始行相对应?

如果您不会检查整个匹配字符串的长度,那么您也可以这样做:

var regex = new Regex(@"^(?<FlightDesignator>([A-Z0-9]{2}[A-Z]?)([0-9]{3,4}))(?<OperationalSuffix>[A-Z])?(?<FlightIdentifierDate>\/(\d{2})([A-Z]{3})?(\d{2})?)?(\s(?<FlightLegsChangeIdentifier>(\/?[A-Z]{3})+)(?=(\s|$)))?(\s1(?<JointOperationAirlineDesignators>(\/.{2}[A-Z]?)+))?(\s3\/(?<AircraftOwner>([A-Z]{2}|.)))?(\s4\/(?<CockpitCrewEmployer>(.+?)(?=(?: \d\/|$))))?(\s5\/(?<CabinCrewEmployer>([A-Z]{2}|.)))?(?<OnwardFlight>\s6\/(([A-Z0-9]{2}[A-Z]?)([0-9]{3,4}))([A-Z])?(\/(\d{2})([A-Z]{3})?(\d{2})?)?)?(\s7\/(?<MealServiceNote>(\/?[A-Z]{0,3})+))?(\s9\/(?<OperatingAirlineDisclosure>(.{2}[A-Z]?)))?");

var input1 = @"BNE1010/1000 HKG1955/2005 7/PLD/CLD/YLD";
var input2 = @"RG878A/21AUG15 GIG/BOG 1/RG/AV 3/AV 4/AV 5/RG 6/AV081C/22 7/CDC/YD 9/TP";

var match1 = regex.Match(input1);
var match2 = regex.Match(input2); 

Console.WriteLine(match1.Length == input1.Length); // False
Console.WriteLine(match2.Length == input2.Length); // True

实例:http://rextester.com/NIBE6349