如果您的正则表达式长度超过 50 个字符,您可以使用匹配整行的肯定前瞻断言开始您的正则表达式,然后添加否定后瞻断言以确保您要匹配的逗号前少于 50 个字符:
(?=.{50})(.*)(?<!.{50})(,)
然后你找到了你想要分割的逗号,例如替换为逗号和换行符。
完整示例:
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"(?=.{50})(.*)(?<!.{50})(,)";
string replacement = "$1,\n";
List<string> inputs = new List<string>();
inputs.Add("AND ( AUART IN ( 'PM01', 'PM02', 'PM03' ) )"); // shorter than 50 chars
inputs.Add("AND ( AUART IN ( 'PM01', 'PM02', 'PM03', 'PM10', 'PM99', 'PM59' ) )");
inputs.Add("AND ( AUART IN ( 'PM01', 'PM01232132132', 'PM03' ) )");
inputs.Add("AND ( AUART IN ( 'PM0654654654654654654654654654651', 'PM02' ) )"); // first comma appearing later than character 50
foreach (string input in inputs)
{
string result = Regex.Replace(input, pattern, replacement);
Console.WriteLine(result);
}
}
}
请注意,这有一些限制:
- 如果引号 (') 中有逗号,则正则表达式将匹配,这可能是也可能不是您想要的。
- 如果第一个逗号出现在位置 50 之后,正则表达式显然会不匹配
- 如果该行超过 ~100 个字符,第二部分将再次超过 50 个字符,我猜这不是你想要的
最后一点可以通过在捕获组中捕获剩余部分并在剩余部分超过 50 个字符时使用递归再次应用正则表达式来解决:
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
List<string> inputs = new List<string>();
inputs.Add("AND ( AUART IN ( 'PM01', 'PM02', 'PM03' ) )"); // shorter than 50 chars
inputs.Add("AND ( AUART IN ( 'PM01', 'PM02', 'PM03', 'PM10', 'PM99', 'PM59' ) )");
inputs.Add("AND ( AUART IN ( 'PM01', 'PM01232132132', 'PM03' ) )");
inputs.Add("AND ( AUART IN ( 'PM0654654654654654654654654654651', 'PM02' ) )"); // first comma appearing later than character 50
inputs.Add("AND ( AUART IN ( 'PM01', 'PM02', 'PM03', 'PM04', 'PM11', 'PM12', 'PM13', 'PM14', 'PM15', 'PM16', 'PM21', 'PM22', 'PM23', 'PM24', 'PM25', 'PM31' ) )"); // string longer than 100 chars, i.e. the remainder needs to be processed again
List<string> results = new List<string>();
var regex = new Regex(@"((?=.{50}).*(?<!.{50}),)(.*)");
foreach (string input in inputs)
{
string str = input;
while(!String.IsNullOrEmpty(str)) {
var match = regex.Match(str);
if (match.Success) {
results.Add(match.Groups[1].Value);
str = match.Groups[2].Value;
} else {
results.Add(str);
break;
}
}
}
Console.WriteLine(String.Join("\n", results));
}
}
结果:
AND ( AUART IN ( 'PM01', 'PM02', 'PM03' ) )
AND ( AUART IN ( 'PM01', 'PM02', 'PM03', 'PM10',
'PM99', 'PM59' ) )
AND ( AUART IN ( 'PM01', 'PM01232132132',
'PM03' ) )
AND ( AUART IN ( 'PM0654654654654654654654654654651', 'PM02' ) )
AND ( AUART IN ( 'PM01', 'PM02', 'PM03', 'PM04',
'PM11', 'PM12', 'PM13', 'PM14', 'PM15', 'PM16',
'PM21', 'PM22', 'PM23', 'PM24', 'PM25',
'PM31' ) )
为了解决第二点,您可以考虑使用逗号, 和空格\s 而不是仅使用逗号(如果在您的应用场景中可能的话)。正则表达式为((?=.{50}).*(?<!.{50})[\s,])(.*)。