如何用正则表达式匹配下一行非指定内容?VS2017实践疑问
如何在VS2017中用正则匹配下一行不是指定内容的行
嘿,我来帮你搞定这个正则匹配的问题!你要实现的是匹配带有SizeConst参数的MarshalAs属性行,同时确保下一行不是对应数字的SizeConst属性,对吧?
先说说你原来正则里的小问题:你用([^\s])*来捕获SizeConst的值,这个表达式只能匹配单个非空白字符然后重复,要是值是多位数(比如15),它只会捕获最后一个字符(也就是5),后面反向引用\1自然就不对了。
给你修正后的正则表达式,直接在VS2017里就能用:
\[\s*MarshalAs\s*\(\s*UnmanagedType\s*\.\s*ByValArray\s*,\s*SizeConst\s*=\s*(\d+)\s*\)\]\s*\r?\n\s*(?!\[\s*SizeConst\s*\(\s*SizeConst\s*=\s*\1\s*\)\])
我给你拆解下关键部分:
(\d+):替换了你原来的([^\s])*,专门用来完整捕获SizeConst的数字值,不管是一位数还是多位数都能搞定。\s*\r?\n\s*:保持了你原来的写法,兼容Windows的\r\n换行,同时忽略换行前后的空格、制表符这些空白。(?!...):这个负向预查的逻辑是对的,现在结合正确的捕获组\1,就能准确判断下一行是不是和上一行数字匹配的SizeConst属性了。
举个测试例子:
会被匹配的情况
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
public byte[] UserData;
不会被匹配的情况
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
[SizeConst(SizeConst = 15)]
public byte[] UserData;
这样调整后,应该就能精准匹配你想要的内容啦!
内容的提问来源于stack exchange,提问作者Lee Li
相关产品推荐
相关产品推荐

