0

是否有可能有一个 .net 正则表达式模式引用模式的另一部分中先前捕获的组的数值?我需要匹配重复以下格式的字符串:

  • 10 字节 alpha 键后跟 2 字节运算符(sql 运算符的子集),后跟 5 个整数位,后跟一个 n 字节值,其中 n = 5 个整数位的整数值。

EX 字符串:
“key1 = 00004val1key2 <=00006value2key3 >=00011value_three”

其中 val1 是 4 字节,value2 是 6 字节,value_three 是 11 字节,等等......这个字符串代表我需要能够解析和识别以下字符串的重复标准集:

第一个标准:“key1”、“=”、“val1”

第二个标准:“key2”、“<=”、“value2”

第三个标准:“key3”、“>=”、“value_three”

我过去使用过 .net 正则表达式,应该能够以重复模式解析键、运算符和数字,但不知道如何,或者即使可以引用模式后面的数字(即字符串“00004”的值为 4 的整数)。

更新 1 最初我认为我需要一个正则表达式模式,例如:

^(?<criteria>(?<key>\w{10})(?<operator>(= |<=|>=))(?<value_length>\d{5})(?<value>\w{n}))+$

其中“value”捕获组中的 {n} 量词需要具有基于“value_length”捕获组的值的值,对于捕获的每个“标准”。如果这不是考虑形成正则表达式模式的正确方法,我可以更改为另一种有效的方法。

4

2 回答 2

0

您可以改为在匹配项本身中捕获所需的长度字符串,直到下一个\w{10}和运算符(= |<=|>=)使用前瞻

string regex=@"(?<key>\w{10})(?<operator>(= |<=|>=))(?<value_length>\d{5})(?<value>.*?(?=\w{10}(= |<=|>=)|$))";
foreach(Match m in Regex.Matches(input,regex,RegexOptions.Singleline))
{
    int vLen=int.Parse(m.Groups["value_length"].Value);
    string requiredString=m.Groups["value"].Value.Substring(0,vLen-1);
}
于 2013-01-18T07:35:00.120 回答
0

我刚刚删除了我的帖子,这是不可能的。正则表达式中有一个叫做反向引用的东西,它可以帮助你:

如果你想匹配aba,那么它的口头模式看起来像value1 followed by another value, followed by value 1,可以构建为正则表达式:(a)b\1,其中\1引用匹配的 FIRST 组的匹配项。

But keep in mind, that a regex using a backreference is actually no more regex, because a "regular language" does - per definition - not allow recursion, which is what is happending behind the szenes. (part of the pattern needs to be evaluated before the complete pattern can be evaluated)

于 2013-01-18T07:44:06.607 回答