很抱歉这个令人困惑的标题,我会试着用例子来解释一下。目前我们有这个表达式来查找字符串中的数字序列
\b((\d[ ]{0,1}){13,19})\b
现在我想修改它以符合这些规则
- 长度应在13到19个字符之间,不包括空格
- 每个数字群集必须至少有3位数
表达式应将这些标记为匹配:
1234567890123
1234 5678 9012 345
不匹配:
123456789012 3
123 12 123 1 23134
我所拥有的当前表达将所有这些表示为匹配 Example
答案 0 :(得分:3)
这可以通过环视来实现。
正则表达式可以更改为以下内容:
\b(?<!\d )(?=(?:\d ?){13,19}(?! ?\d))(?:\d{3,} ?)+\b(?! ?\d)
这可以通过展望来确保数字长度在13到19位之间。然后匹配3位或更多位的组。然后在发现所有3组之后使用负向前看以确保没有任何数字。如果有,我们发现一个小于3的组。这适用于您提供的示例。
\b
确保它是&#34;字的开头&#34;。(?<!\d )
确保没有数字。(?=(?:\d ?){13,19}(?! ?\d))
向前看以确保数字长度在13到19位之间
(?:\d ?){13,19}
来自原创。添加了?:
以进行非捕获(?! ?\d)
负向前看:如果在获得19位数字后仍有数字,则过大会丢弃当前匹配(?:\d{3,} ?)+
匹配任意数量的大于3的群集(最小值13,最大值为19,首先向前看)\b(?! ?\d)
查找群集的结尾。如果在群集结束后仍有数字,则必须存在太小的群集。答案 1 :(得分:1)
我建议以下解决方案也基于外观:
\b\d(?!\d?\b)(?: ?\d(?!(?<= \d)\d?\b)){12,18}\b
重点是,如果它不是1位或2位数组的一部分,我们只匹配下一位数。
模式说明
\b
- 开始字边界\d(?!\d?\b)
- 一个未跟随1或0位的数字,然后是一个尾随字边界(即,如果它是12
或1
类似于组,则会失败)(?: ?\d(?!(?<= \d)\d?\b)){12,18}
- 12到18次出现:
?
- 1或0个空格\d(?!(?<= \d)\d?\b)
- 任何未跟随1或0位的单个数字后跟一个字边界(感谢(?!\d?\b)
),如果该1或0位前面有空格+ 1数字((?<= \d)
lookbehind确实如此)\b
- 一个尾随字边界。请注意,如果您想在非数字上下文中匹配这些字符串(也就是说,如果您不想允许左侧和右侧的任何数字),您可能还会考虑添加(?<!\d *)
位于前面,(?! *\d)
位于模式的末尾。
请注意,要匹配任何空格,您可以在模式中用\s
替换文字空间。
答案 2 :(得分:0)
如果您可以使用Linq,这将更容易维护:
var myList = new List<string>
{
"1234567890123",
"1234 5678 9012 345",
"123456789012 3",
"123 12 123 1 23134"
};
foreach(var input in myList)
{
var splitted = Regex.Split(input, @"\s+"); // Split on whitespace
var length = splitted.Sum(x => x.Length); // Compute the total length
var smallestGroupSize = splitted.Min(x => x.Length); // Compute the length of the smallest chunck
Console.WriteLine($"Total lenght: {length}, smallest group size: {smallestGroupSize}");
if (length < 13 || length > 19 || smallestGroupSize < 3)
{
Console.WriteLine($"Input '{input}' is incorrect{Environment.NewLine}");
continue;
}
Console.WriteLine($"Input '{input}' is correct!{Environment.NewLine}");
}
产生:
总长度:13,最小团体规模:13 输入&#39; 1234567890123&#39;是对的!
总长度:15,最小群体规模:3 输入&#39; 1234 5678 9012 345&#39;是对的!
总长度:13,最小群体大小:1 输入&#39; 123456789012 3&#39;是不正确的
总长度:14,最小群体大小:1 输入&#39; 123 12 123 1 23134&#39;是不正确的