Существует ряд проблем с вашим текущим подходом.
- Группы из двух символов не совпадают:
# strings split into groups of two
'12' 'AB' '34' # first string
'CD' ' 3' '4 ' # second string
Когда вы тестируете несколько строк с помощью -match
, вам необходимо
- экранировать входную строку, чтобы избежать совпадений с метасимволами (например,
.
), и - поместите коллекцию слева от оператора, рисунок справа:
$Compare = $FBString_Split | % {$Data_Split -match [regex]::Escape($_)}
if ($Compare -contains $true) {
Write-Host "Found"
} else {
Write-Host "Not Found"
}
Для более общего решениячтобы выяснить, является ли любая подстрока из N символов одной строки также подстрокой другой, вы, вероятно, могли бы сделать что-то вроде этого:
$a = '12AB34.US'
$b = 'CD 34 EF'
# we want to test all substrings of length 2
$n = 2
$possibleSubstrings = 0..($n - 1) | ForEach-Object {
# grab substrings of length $n at every offset from 0 to $n
$a.Substring($_) -split "($('.'*$n))" | Where-Object Length -eq $n |ForEach-Object {
# escape the substring for later use with `-match`
[regex]::Escape($_)
}
} |Sort-Object -Unique
# We can construct a single regex pattern for all possible substrings:
$pattern = $possibleSubstrings -join '|'
# And finally we test if it matches
if($b -match $pattern){
Write-Host "Found!"
}
else {
Write-Host "Not found!"
}
Этот подход даст вам правильныйответ, но это будет очень медленно на больших входах, и в этот момент вы можете захотеть взглянуть на стратегии, не основанные на регулярных выражениях, такие как Boyer-Moore