如何使用正则表达式匹配下一行不是什么的行?

时间:2018-04-11 03:07:01

标签: .net regex

我正在使用正则表达式在Windows 10上的Visual Studio 2017中进行搜索(请参阅Visual Studio文档:Use Regular Expressions)。

我试过这个:

\[\s*MarshalAs\s*\(\s*UnmanagedType\s*\.\s*ByValArray\s*,\s*SizeConst\s*=\s*([^\s])*\)]\s*\r?\n\s*(?!\[\s*SizeConst\s*\(\s*SizeConst\s*=\s*\1\s*\)\])

根据上述文件:

\r?\n表示新行。

(?!expression)表示无效匹配。

此正则表达式匹配 [MarshalAs(UnmanagedType.ByValArray,SizeConst = 15)] 以及 之前的新行和下一行空格SizeConst(SizeConst = 15)] ,但我希望匹配一行 [MarshalAs(UnmanagedType.ByValArray,SizeConst = 15)] 下一行不是 [SizeConst(SizeConst = 15)]

   [MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
   [SizeConst(SizeConst = 15)]

我想确保每一行

[MarshalAs(UnmanagedType.ByValArray,SizeConst = variable)]

下一行是

[SizeConst(SizeConst = variable)]

变量可以是数字或单词,也可以是点状'object.member'。第一行和第二行中的变量必须相同。

那么我怎样才能找到这条线

[MarshalAs(UnmanagedType.ByValArray,SizeConst = variable)]

下一行不是

[SizeConst(SizeConst = variable)]

3 个答案:

答案 0 :(得分:0)

\[MarshalAs\(UnmanagedType.ByValArray, SizeConst = [0-9]*\)\]\n(?!\[SizeConst\(SizeConst = [0-9]*\)\])

这将匹配下面的第二个实例,而不是第一个

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
[SizeConst(SizeConst = 15)]

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
[izeConst(SizeConst = 15)]

魔术是(?!\[SizeConst\(SizeConst = [0-9]*\)\])(?!)是一个负面的向前看,它意味着只有当前面的事情发生时才匹配,并且匹配{{1}内部的内容(?!) 1}}(相反,正向前看是(?=)

此网站非常适合使用正则表达式https://regexr.com/

请注意,如果[SizeConst(SizeConst=15)]=周围没有空格)来修复您可以使用

,它将无效
\[MarshalAs\(UnmanagedType.ByValArray, SizeConst\s*=\s*[0-9]*\)\]\n(?!\[SizeConst\(SizeConst\s*=\s*[0-9]*\)\])

\s*表示零个或多个空格。

答案 1 :(得分:0)

你可以这样做:

 \[MarshalAs\(UnmanagedType\.ByValArray, SizeConst = \d+\)\](?!\n\[SizeConst\(SizeConst = \d+\)\])

请参阅正则表达式:https://regex101.com/r/9UKsmj/1

使用否定向前看?!仅匹配未跟随的行 [SizeConst(SizeConst = variable)]其中variable是任意数字。

答案 2 :(得分:0)

这应该让你开始:

\[MarshalAs\(UnmanagedType\.ByValArray,\sSizeConst\s=\s(\d+|[\w+.]+)\)\](?!\r?\n\[SizeConst\(SizeConst = \1\)\])

  • 否定断言?!允许您使用那些不是的行 然后根据需要匹配一行。

  • 对捕获组\1的引用可确保变量符合行 两个与第一行相同。

Demo

示例代码:

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"\[MarshalAs\(UnmanagedType\.ByValArray,\sSizeConst\s=\s(\d+|[\w+.]+)\)\](?!\r?\n\[SizeConst\(SizeConst = \1\)\])";
        string input = @"[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
[SizeConst(SizeConst = 15)]

[MarshalAs(UnmanagedType.ByValArray, SizeConst = object.member)]
[SizeConst(SizeConst = object.member)]

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
[SizeConst(SizeConst = 14)]

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
[SizeConst(SizeConst = object.member)]";

        foreach (Match m in Regex.Matches(input, pattern))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}