c#中的正则表达式模式K替代品

本文关键字:替代品 模式 正则表达式 | 更新日期: 2023-09-27 17:51:03

我有一个正则表达式,我测试http://gskinner.com/RegExr/和它的工作,但当我在我的c#应用程序中使用它失败了。

我的正则表达式:(?<!'d)'d{6}'K'd+(?='d{4}(?!'d))文本:4000751111115425结果:111111

我的正则表达式有什么问题?

c#中的正则表达式模式K替代品

您遇到的问题是。net正则表达式不支持'K, "丢弃迄今为止匹配的内容"。

我相信你的regex翻译为"匹配任何超过十个'd数字的字符串,尽可能多的数字,并丢弃前6个和最后4个"。

我相信。net兼容的正则表达式

(?<='d{6})'d+(?='d{4})

达到同样的效果。请注意,对于no-more- 'd - s,不需要负向前看/向后看,因为'd+是贪婪的-引擎已经尝试匹配尽可能多的数字。

一般来说,'K操作符(丢弃到目前为止从匹配内存缓冲区匹配的所有文本)可以用两种技术模拟:

  • 看看
  • 捕获组(带或不带查找)。
例如,

  • PCRE a+b+c+='K'd+ (demo) = .NET (?<=a+b+c+=)'d+a+b+c+=('d+) (and grab Group 1 value)
  • PCRE ^[^][]+'K.* (demo) = . net (?<=^[^][]+)(?:'[.*)?$ (demo)或(此处更好)^[^][]+(.*) (demo).

第二个例子的问题是[^][]+可以匹配与.*相同的文本(这些模式重叠),并且由于两种模式之间没有明确的边界,因此仅使用向后看实际上不起作用,需要额外的技巧才能使其工作。

捕获组方法在这里是通用的,应该在所有情况下都有效。

由于'K使正则表达式引擎"忘记";到目前为止使用的匹配部分,这里最好的方法是使用捕获组来获取您需要在左侧上下文之后获得的匹配部分:

using System;
using System.Text.RegularExpressions;
public class Test
{
    public static void Main()
    {
        var text = "Text  4000751111115425";
        var result = Regex.Match(text, @"(?<!'d)'d{6}('d+)(?='d{4}(?!'d))")?.Groups[1].Value;
        Console.WriteLine($"Result: '{result}'");
    }
}

请参阅在线c#演示和正则表达式演示(请参阅Table选项卡以获得正确的结果表)。 :

  • (?<!'d) -左数字边界
  • 'd{6} -六位数字
  • ('d+) - 捕获组1:一个或多个数字
  • (?='d{4}(?!'d)) -一个正向前看,匹配紧接四个数字而不是紧接另一个数字的位置。