【发布时间】:2015-09-17 08:42:35
【问题描述】:
在以下字符串中:
G 767
我正在尝试将G 和767 与我在运行时加入的两个模式相匹配,因为它们中的每一个都是一个单独的类型,我有一个单独的类。
^(?<ServiceType>[A-Z])(?= )
和
(?<= )(?<AircraftType>[A-Z0-9]{3})(?= |$)
如果我使用G 和767 分别对每个模式进行单元测试,它们可以工作,但将回溯连接在一起,会将正则表达式引擎发送到字符串的开头(在 regex101 调试器中测试)。但是,当我在两个环视之间放置一个空格时,它会起作用。如果可能的话,我宁愿不这样做。当我使用两个 ? ? 而不是环视时,它也可以工作,但我对这个解决方案也不是很满意,因为它允许两个空格,而只允许一个空格。
我应该如何修改模式,以便它们适用于单独测试的每个案例,也适用于组合在一起的案例。
为什么在第一次匹配之后引擎开始扫描字符串的开头会发生这种情况?我认为它会在G 之后继续,然后看到后面的空间并匹配第二个字符串。
计划是创建重叠的图案,并且空间应该对它们两者来说是公用的。
【问题讨论】:
-
你最终的正则表达式是什么样子的?你的lookarrounds不消耗任何字符。如果将两者结合在一起,则空格必须匹配,但您的正则表达式无法识别它。
-
最后的正则表达式就是第一个 + 第二个。该空间与前瞻和后瞻相匹配,但前提是我分别测试它们。合并模式不是那样工作的。
-
Lookarrounds 不消耗任何字符。你必须添加它。但是你的第一个正则表达式会强制这个空间。为什么不将它包含在模式中?
^(?<ServiceType>[A-Z])\s这应该适用于您的测试和连接。 -
@stribizhev 这仅匹配第一个字符串。
标签: c# regex backtracking regex-lookarounds