正则表达式C#搜索文件的匹配模式以及以...结尾

时间:2013-04-20 04:35:26

标签: c# regex

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

因此示例代码将是

(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”with:

(\(1965)  

..或(前面有(ADD)):

[(](ADD){1}\r\n\r\n\t\s[(][0-9]{4,}\r\n\r\n\t\s\s(\("){1}[a-zA-Z]{1,}("\)){1}

..但我似乎无法真正让这些类型的正则表达式工作它必须是间距和换行符 我坚持理解结束PLA的匹配并在下一组数据开始)之前“检测”结束(1966 ("PLA"),因为我认为这是我在匹配中用来检测结束的比赛,但不包括在调查结果中。

3 个答案:

答案 0 :(得分:0)

如果您知道数据内部未出现(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#中引用,如下所示:

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
    ";

答案 1 :(得分:0)

这就是我提出的:

编辑:我修改了表达式以考虑N个“clinesegs”,可以在“Line to line angle”组之前和之后使用任意数量的组。

\([\d]+[\s]+\("PLA"\)([\s]+\(.+)+[\s]+\(([\s]+\(.+)+[\s]+\)([\s]+\(.+\))+[\s]+\)

它会捕获从(1965到结束)的所有内容。

答案 2 :(得分:0)

尝试这种模式:在1965年以这种模式使用你的id

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

使用RegexOptions.SingleLine