【问题标题】:Regular expression with full match only仅完全匹配的正则表达式
【发布时间】:2018-11-21 17:12:00
【问题描述】:

我知道这个陈旧的主题,并且我阅读了相关答案...
但是,我会问...
我有下一种格式的输入字符串:

3#0.01, 2#0.5, 1#-10, -2#~ 

所以这是一个用逗号分隔的值列表。
我可以用下一个表达式捕获所有值:

(([-+]?\d+)#([-+]?\d*\.?\d+|~))+ 

一切正常。

但如果输入字符串中出现任何错误,我希望不匹配,例如:

MISTAKE3#0.01, 2#0.5, 1#-10, -2#~AND_HERE_MISTAKE_TOO 

不幸的是 ^ 和 $ 符号在这里没有帮助。
所以我的问题是:如果输入字符串的某些部分无效,我该如何停止匹配。
谢谢。

这里是 sn-p:https://regex101.com/r/Xih0Qk/2

【问题讨论】:

  • 试试(([-+]?\b\d+)#([-+]?\d*\.?\d+|~\B))+
  • Wiktor,感谢您的尝试。但是,不幸的是,没有。
  • 那么,您只想在验证整个字符串后才将它们全部匹配? regex101.com/r/Xih0Qk/3 之类的东西?
  • Wiktor,这正是我想要的。
  • Wiktor,wielkie dzięki,如果我猜到了 ;)

标签: .net regex lookahead lookbehind


【解决方案1】:

在 .NET 中,您可以使用具有无限宽度lookbehinds 的正则表达式(如果您需要在其中移植相同的解决方案,它也支持最新的 ECMAScript 2018 驱动的 JavaScript 环境)。正则表达式看起来像

(?<=^(?:[-+]?\d+#(?:[-+]?\d*\.?\d+|~),\s)*)[-+]?\d+#(?:[-+]?\d*\.?\d+|~)(?=(?:,\s[-+]?\d+#(?:[-+]?\d*\.?\d+|~))*$)

online regex demo

在代码中,从变量构建模式更容易:

var block = @"[-+]?\d+#(?:[-+]?\d*\.?\d+|~)";   // Block/unit pattern
var pattern = $@"(?<=^(?:{block},\s)*){block}(?=(?:,\s{block})*$)";
var results1 = Regex.Matches("3#0.01, 2#0.5, 1#-10, -2#~", pattern)
    .Cast<Match>().Select(x => x.Value);
if (results1.Count() > 0)
    Console.WriteLine(string.Join(", ", results1));
var results2 = Regex.Matches("MISTAKE3#0.01, 2#0.5, 1#-10, -2#~AND_HERE_MISTAKE_TOO", pattern)
    .Cast<Match>().Select(x => x.Value);
if (results2.Count() > 0)
    Console.WriteLine(string.Join(", ", results2));

请参阅C# demo online。输出(仅匹配正确的字符串):

3#0.01, 2#0.5, 1#-10, -2#~

模式说明

  • (?&lt;=^(?:{block},\s)*) - 正向后视,仅匹配紧接在字符串开头出现 0 次以上 {block} 模式后跟 , 和 1 个空格的位置
  • {block} - 要匹配的块/单元模式
  • (?=(?:,\s{block})*$) - 一个正向前瞻,它与紧跟在字符串末尾出现 0 次以上的 ,、一个空格和一个 {block} 模式的位置相匹配。

【讨论】:

  • 维克托,谢谢!你是最棒的。我可以问一些小细节:我怎样才能只匹配错误的模式。错误 3#0.01、2#0.5、1#-10、-2#~AND_HERE_MISTAKE_TOO。例如,这一行的第一个和最后一个。
  • @SergeyAlikin 也许,如果你删除所有有效的,Regex.Replace(s, @"(?:^|,\s)[-+]?\d+#(?:[-+]?\d*\.?\d+|~)(?=,\s|$)", "").Split(new[] {", "}, StringSplitOptions.None)
  • 维克托,非常感谢。我不会再打扰你了。
猜你喜欢
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多