匹配它们之间带有 space 的字符串并连接具有重叠 space 的模式

Matching strings with a space between them and joining patterns with overlapping space

在以下字符串中:

G 767

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

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

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

如果我用 G767 分别对每个模式进行单元测试,它们可以工作,但连接在一起时,回溯会将正则表达式引擎发送到字符串的开头(在 regex101 调试器中测试)。但是,当我在两个环视之间放置 space 时,它会起作用。如果可能的话,我宁愿不这样做。当我使用两个 ? ? 而不是环顾四周时它也有效,但我对这个解决方案也不是很满意,因为它允许两个 space,而只允许一个。

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

为什么会发生这种情况,在第一次匹配后引擎开始扫描字符串的开头?我认为它会在 G 之后继续,然后查看 space 的后视并匹配第二个字符串。

计划是创建重叠模式,space 应该对它们都是通用的。

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

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

这些可以合并在一起:

var pattern = firstPattern + secondPattern;

如果它不起作用,请指出确切的问题。

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

您必须使用 space 因为 lookarounds0 width assertions 所以不会使用 space.For 正则表达式引擎来获得 space 具有的整体匹配被某人消费。