正则表达式C#搜索匹配模式的文件以开始,以结束

正则表达式C#搜索匹配模式的文件以开始,以结束,c#,regex,C#,Regex,在C#中,我想搜索匹配发生的位置,从括号中的整数开始,后跟这些字符“PLA”括号和“Match”(我将读入内存),直到到达下一个集合 因此,示例代码将是 (1965 ("PLA") ("GEN_ANGLE") ("Line to line angle") ( ("clinesegs" 3565.01 1265.99 "SURFACE") ("clinesegs" 3618.02 1255.00 "SURFACE") )

在C#中,我想搜索匹配发生的位置,从括号中的整数开始,后跟这些字符“PLA”括号和“Match”(我将读入内存),直到到达下一个集合

因此,示例代码将是

(1965
    ("PLA")
    ("GEN_ANGLE")
    ("Line to line angle")
    (
        ("clinesegs" 3565.01 1265.99 "SURFACE")
        ("clinesegs" 3618.02 1255.00 "SURFACE")
    )
    ((3586.02 1267.20 "SURFACE"))
    (120.000)
    (90.000)
)
(1966
    ("PLA")
    ("GEN_ANGLE")
    ("Line to line angle")
    (
        ("clinesegs" 3831.98 1255.00 "SURFACE")
        ("clinesegs" 3882.92 1268.07 "SURFACE")
    )
    ((3863.98 1267.20 "SURFACE"))
    (120.000)
    (90.000)
)
我想“匹配”数据,只在知道“1965”是我要找的ID的基础上获取这些数据

(1965
    ("PLA")
    ("GEN_ANGLE")
    ("Line to line angle")
    (
        ("clinesegs" 3565.01 1265.99 "SURFACE")
        ("clinesegs" 3618.02 1255.00 "SURFACE")
    )
    ((3586.02 1267.20 "SURFACE"))
    (120.000)
    (90.000)
)
我可以找到“(1965年)与:

…或(前面加上):

…但我似乎无法真正让这些类型的正则表达式工作,它必须是间距和换行符

在下一组数据开始之前,我一直在理解结尾PLA的匹配和“检测”结尾
(1966(“PLA”),因为我想这是我在匹配中用来检测匹配结束的,但只是不包括在结果中。

如果你知道后面是
(1966(“PLA”)
如果不在数据内部出现,可以使用以下方法:

(?xs)                     # ignore spaces, comments and make . match \n
\(1965\s+\("PLA"\)
.*?                       # ungreedy
(?=\(1966\s+\("PLA"\)|$)  # lookahead does not include this in the match
可以用C#这样引用:


这就是我想到的:

编辑:我修改了表达式以说明N个“倾斜”组,可用于“线到线角度”组前后任意数量的组


它将捕获从
(1965
到结束

尝试以下模式:在此模式中使用1965年的id

(?=\(1965)(?=.*\(\"PLA\"\).*)\(((([^)])*\([^)]+\)[^)]*)\))*\)*[^\)]*\)

使用RegexOptions。单线

在开始尝试匹配括号对之前,请确保通读最高评分的答案(可能,但其他方法可能更容易)。不一定要遵循1966年,我想我应该寻找“(\d+后跟(“PLA”)@CoreStone,然后将
1966
替换为
\d+
。我今天刚买了这个工具,就把它粘贴到了“RegexBuddy”中,但也许我做得不对,我会再看一遍,但你要匹配11次(11行)。当我有40个“线对线角度”时会发生什么“那么,仅仅计数并不能成功结束比赛,我需要找到下一个“记录”的开始位置,即”(1966(“PLA”)“是的,我希望它是用xml完成的,但这是我必须处理的。thxOk,我回到绘图板上,为您解出了这个问题。这个表达式有点长,但它解释了N个“clinesegs”。现在,它希望其余的项目都是相同的(或多或少),但如果您查看该模式,您应该能够根据需要使其更加灵活。编辑内容在我的原始帖子中。
(?xs)                     # ignore spaces, comments and make . match \n
\(1965\s+\("PLA"\)
.*?                       # ungreedy
(?=\(1966\s+\("PLA"\)|$)  # lookahead does not include this in the match
var re = @"(?xs)               # ignore spaces, comments and make . match \n
    \(1965\s+\(""PLA""\)
    .*?                        # ungreedy
    (?=\(1966\s+\(""PLA""\)|$) # lookahead does not include this in the match
    ";
(?=\(1965)(?=.*\(\"PLA\"\).*)\(((([^)])*\([^)]+\)[^)]*)\))*\)*[^\)]*\)