0

在 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”):

(\(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")这就是我在比赛中用来检测比赛结束的方法,但只是不将其包含在结果中。

4

3 回答 3

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
    ";
于 2013-04-20T04:47:26.850 回答
0

这就是我想出的:

编辑:我修改了表达式以考虑 N 个“clinesegs”,适用于“线到线角度”组之前和之后的任意数量的组。

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

它将捕获从(1965直到关闭的所有内容)

于 2013-04-20T04:49:20.297 回答
0

试试这个模式:在这个模式中使用你 1965 的 id

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

使用 RegexOptions.SingleLine

于 2013-04-20T05:14:46.683 回答