匹配字符串,它们之间有空格,并且连接具有重叠空间的图案

时间:2015-09-17 08:42:36

标签: c# regex backtracking regex-lookarounds

在以下字符串中:

G 767

我试图将G767与我在运行时加入的两种模式相匹配,因为每种模式都是一个单独的类型,我有一个单独的类。

^(?<ServiceType>[A-Z])(?= )

(?<= )(?<AircraftType>[A-Z0-9]{3})(?= |$)

如果我用G767分别对每个模式进行单元测试,它们可以工作但连接在一起,则回溯将正则表达式引擎发送到字符串的开头(在regex101调试器中测试)。然而,当我在两个外观之间放置一个空格时,它可以工作。如果可能的话,我宁愿不去做。它也适用于我使用两个? ?而不是外观,但我对此解决方案并不满意,因为它允许两个空格,只允许一个空格。

我应该如何修改模式,以便它们适用于单独测试的每个案例以及连接在一起时。

为什么在第一场比赛后发动机开始扫描字符串的开头时会发生这种情况?我认为它会在G之后继续,然后看到后视空间并匹配第二个字符串。

计划是创建重叠模式,这两个空间应该是共同的。

2 个答案:

答案 0 :(得分:1)

也许您可以使用以下模式:

^(?<ServiceType>[A-Z])\s(?<= )(?<AircraftType>[A-Z0-9]{3}(?= |$)

这些可以与:

合并在一起
var pattern = firstPattern + secondPattern;

如果它不起作用,请说明确切的问题。

答案 1 :(得分:1)

^(?<ServiceType>[A-Z])(?= ) +(?<= )(?<AircraftType>[A-Z0-9]{3})(?= |$)

您必须使用spacelookarounds0 width assertions,因此不会占用空间。要使正则表达式引擎获得整体匹配,必须使用space某人。