我有下面的数组,需要两个正则表达式过滤器,我想在PowerShell中使用。
000111 010101 220220 123456
筛选器1:出现次数等于或多于三次的数字0。筛选后我希望得到以下值
000111 010101
过滤器2:所有出现三次或三次以上的数字。我应该只看到这些数字。
000111 010101 220220
使用**0{3,}**我只能识别序列中的数字,因此我只能得到数字
000111
是否可以找到其他号码之间的重复号码?
3wabscal1#
既然你坚持 * 在regex中查看解决方案 *,那么看看这个:'(\d).*\1.*\1'我想这是可以理解的,不需要进一步解释,不是吗?
'(\d).*\1.*\1'
cbwuti442#
'(0).*\1.*\1'
0
过滤器1的出现计数变体:
@( '000111' '010101' '220220' '123456' ).ForEach({ $zerosOnly = $_ -replace '[^0]' [pscustomobject] @{ InputString = $_ CountOfZeros = $zerosOnly.Length } })
也就是说,输入数组中的每个字符串(通过固有的ForEach()方法枚举)都有通过基于regex的-replace运算符删除的所有字符,因此结果字符串的长度等于零的计数。输出:
ForEach()
-replace
InputString CountOfZeros ----------- ------------ 000111 3 010101 3 220220 2 123456 0
过滤器2的出现计数变体
@( '000111' '010101' '220220' '123456' ).ForEach({ $outputObject = [pscustomobject] @{ InputString = $_; DigitCounts = [ordered] @{} } ([char[]] $_ | Group-Object).ForEach({ $outputObject.DigitCounts[$_.Name] = $_.Count }) $outputObject })
也就是说,每个输入字符串by都使用Group-Object按其字符分组,Group-Object的输出对象反映.Name属性中的现有字符和组成员数(即.Count属性中该字符的出现次数)。有序的hashtable用于报告字符-出现次数-计数对。输出:
Group-Object
.Name
.Count
InputString DigitCounts ----------- ----------- 000111 {[0, 3], [1, 3]} 010101 {[0, 3], [1, 3]} 220220 {[0, 2], [2, 4]} 123456 {[1, 1], [2, 1], [3, 1], [4, 1]…}
例如,上述输出中的{[0, 2], [2, 4]}表示字符'0'在输入字符串'220220'中出现2次,'2'4次。
{[0, 2], [2, 4]}
'0'
'220220'
2
'2'
4
2条答案
按热度按时间3wabscal1#
既然你坚持 * 在regex中查看解决方案 *,那么看看这个:
'(\d).*\1.*\1'
我想这是可以理解的,不需要进一步解释,不是吗?
cbwuti442#
'(0).*\1.*\1'
作为过滤器1),而且绝对是当前问题的最佳解决方案,因为您只需要抽象地知道 * 是否 * 给定字符串有 * 3个或更多 * 零/相同的数字。0
s/digits的 * 特定计数 *,下面的解决方案可能会很有意思,据我所知,这不能由正则表达式(单独)处理过滤器1的出现计数变体:
也就是说,输入数组中的每个字符串(通过固有的
ForEach()
方法枚举)都有通过基于regex的-replace
运算符删除的所有字符,因此结果字符串的长度等于零的计数。输出:
过滤器2的出现计数变体
也就是说,每个输入字符串by都使用
Group-Object
按其字符分组,Group-Object
的输出对象反映.Name
属性中的现有字符和组成员数(即.Count
属性中该字符的出现次数)。有序的hashtable用于报告字符-出现次数-计数对。输出:
例如,上述输出中的
{[0, 2], [2, 4]}
表示字符'0'
在输入字符串'220220'
中出现2
次,'2'
4
次。