【问题标题】:Matching strings with a space between them and joining patterns with overlapping space匹配字符串与它们之间的空间和连接具有重叠空间的模式
【发布时间】:2015-09-17 08:42:35
【问题描述】:

在以下字符串中:

G 767

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

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

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

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

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

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

计划是创建重叠的图案,并且空间应该对它们两者来说是公用的。

【问题讨论】:

  • 你最终的正则表达式是什么样子的?你的lookarrounds不消耗任何字符。如果将两者结合在一起,则空格必须匹配,但您的正则表达式无法识别它。
  • 最后的正则表达式就是第一个 + 第二个。该空间与前瞻和后瞻相匹配,但前提是我分别测试它们。合并模式不是那样工作的。
  • Lookarrounds 不消耗任何字符。你必须添加它。但是你的第一个正则表达式会强制这个空间。为什么不将它包含在模式中? ^(?&lt;ServiceType&gt;[A-Z])\s 这应该适用于您的测试和连接。
  • @stribizhev 这仅匹配第一个字符串。

标签: c# regex backtracking regex-lookarounds


【解决方案1】:

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

^(?&lt;ServiceType&gt;[A-Z])\s(?&lt;= )(?&lt;AircraftType&gt;[A-Z0-9]{3}(?= |$)

这些可以合并在一起:

var pattern = firstPattern + secondPattern;

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

【讨论】:

  • 我希望能够集中这两种模式,以便它们之间的每个模式已经匹配的空间对它们来说都是通用的,但我不想添加额外的空间。我曾希望这两个外观能在空间上重叠。
  • @t3chb0t 我改变了答案。希望它现在可以工作。
  • 其实我应该接受两个答案 ;-) 但是选择这个。 @vks 感谢您解释零宽度断言。我将在字符串之后使用消耗空间,并在下一个字符串中进行回顾。我必须添加另外一些模式,所以我认为这似乎是一个很好的折衷方案。
【解决方案2】:
^(?<ServiceType>[A-Z])(?= ) +(?<= )(?<AircraftType>[A-Z0-9]{3})(?= |$)

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

【讨论】:

  • 知道这一点解决了我在后续模式中遇到的一些其他问题 ;-)
  • @t3chb0t 很高兴它有帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 2016-05-27
  • 2023-01-27
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
相关资源
最近更新 更多