我正在使用正则表达式在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
)]
答案 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
的引用可确保变量符合行
两个与第一行相同。
示例代码:
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);
}
}
}