gpt4 book ai didi

c# - 如果在模式中间遇到字符串,则正则表达式不匹配

转载 作者:行者123 更新时间:2023-11-30 23:16:31 25 4
gpt4 key购买 nike

我有以下正则表达式,用于查找我需要解析的文件区域:

public static readonly Regex ObjectAction = new Regex($@"(?<Shape>{GetShapeOrRegexSnippet}).+?userdata\s"".*?action=(?<ActionType>\w+)\^(?<ActionPropertyString>.*?)\^\""", RegexOptions.Singleline);

其中 GetShapeOrRegexSnippet 定义为:

private static string GetShapeOrRegexSnippet => ShapeCodes.Aggregate((i, j) => i + '|' + j);

匹配我的集合中遇到 ShapeCodes 之一(rectcircline)之间(包括)的区域 等)和以 开头的行。用户数据。这适用于结构良好的部分,例如:

line \
16.5894 34.4828 34.8993 46.3054 19.6616 41.3793 \
11.6741 44.9507
. filled 1
. dynprop \
(FOX_VAR_3 \
(= * \
(ecolor FOX_VAR_3))) \
(o2 \
(= * \
(call fox_oos(__self))))
. userdata "FOX_VAR=3^attr=ECOLOR^attrval=3^required=0^var=UPDATETAG33^delta=1.000000^conv=LOOKUP^type=LONG^minstate=0^num_entries=2^entries=7,7^END_FOXV= ^oos_obj=0002"

但是,给定形状完全有可能没有关联的 userdata 字符串,因此是否可以规定如果 Regex 遇到任何 ShapeCodes 在它遇到 userdata 字符串之前它不会匹配该部分并继续检查文件的其他部分?

我最初的想法是使用负前瞻,但这不起作用(我对 Regex 很陌生,所以我可能做错了什么):

(?<Shape>rect|frect|fpie|spline|poly|line|fsec|fcir).+?(?!rect|frect|fpie|spline|poly|line|fsec|fcir)userdata\s\".*?attr=(?<AttributeType>\w+)\^(?<AttributePropertyString>.*?)\^(?=(?:END_FOXV))

这可能吗?如果是这样,请您指出正确的方向,如果不是,请告诉我,我会尝试不同的方法。

最佳答案

重点是 .+? 尽可能少地匹配任何 1+ 个字符,但是 {GetShapeOrRegexSnippet} 的第一个匹配项.这就是为什么它可以跨多个 block 进行匹配。

将第一个 .+? 替换为 (?:(?!{GetShapeOrRegexSnippet}|action=).)*,一个经过调整的贪婪标记,它只会匹配0+ 个字符未开始与 {GetShapeOrRegexSnippet}action= 匹配的序列。

关于c# - 如果在模式中间遇到字符串,则正则表达式不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41959505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com