【问题标题】:Regular expression dilemma when trying to match strings尝试匹配字符串时的正则表达式困境
【发布时间】:2019-12-15 16:48:10
【问题描述】:

这是 Delphi 10.3.3 IDE 的代码编辑器中的一行代码:

蓝色标识字符串常量:'ab''cd'

现在我尝试用正则表达式 (System.RegularExpressions) 匹配以下主题中的字符串:

ThisString := 'ab''cd'{'};
OtherString := 'simple';
  1. 如果我使用正则表达式 '.*',那么我会在 RegexBuddy 4.10 中得到这个结果:

  1. 如果我使用其他正则表达式 '.*?',我会得到以下结果:

您可以看到两个正则表达式都不匹配所需的正确结果。

如何解决这个困境?

【问题讨论】:

标签: regex delphi delphi-10.3-rio


【解决方案1】:

要获得示例数据的广泛匹配并仅获得匹配而不是组,您可以使用环视和否定字符类并重复匹配 2 个单引号。

(?:'[^']*')+(?=[^;]*;)

Regex demo

为了获得更精确的匹配,您可以对空白边界使用环视:

(?<!\S)(?:'[^']*')+(?=(?:{[^{}]+})?;(?!\S))

Regex demo

要匹配 1 个或多个重复对,您可以使用:

 (?:'[^']*')+

【讨论】:

  • 两个正则表达式都不匹配这个字符串:ThisString := 'ab''cd' {'};
  • 在这种情况下,您可以从模式 regex101.com/r/PytWjb/1 中省略 \s
  • 只有当字符串中有零个或无限个单引号对时才应该匹配。
  • 奇怪的是,我发现这个正则表达式似乎工作正常:(?:'[^\s']*')+ 但如果字符串中的单引号前后有空格,它就不能正常工作。
  • 但是,如果字符串(= 单引号边界之间)确实包含任何空格,则此正则表达式也不起作用。这意味着这不匹配:OtherString := 'si mple'
猜你喜欢
  • 1970-01-01
  • 2012-06-05
  • 2013-12-25
  • 1970-01-01
相关资源
最近更新 更多