匹配字符串的一部分

时间:2019-02-01 19:07:24

标签: regex string vb.net

我有2个字符串,每个字符串包含25个字符。例如

   X = "0000111111110111111111110"
   Y = "0000011111000000000000000"

如果每个具有“ 1”字符串Y的位置在字符串X中也具有“ 1”,那么最有效的识别或为假的方法是什么?在此示例中,它应返回True,因为X中有1与Y中所有1的位置匹配。

我可以阅读每个角色的位置,并比较所有25个字符,但我希望某个聪明的人会知道更优雅的方式。

5 个答案:

答案 0 :(得分:5)

更容易的方式是使用Convert.ToInt32()将字符串解析为二进制文字并执行二进制AND

Public Function MatchAsBinary(ByVal x As String, ByVal y As String) As Boolean
    Dim x_int = Convert.ToInt32(x, 2)
    Dim y_int = Convert.ToInt32(y, 2)

    Return (x_int And y_int) = y_int
End Function

更快(在发行版本中约为10次)的方式是直接比较字符:

Public Function MatchAsChars(ByVal x As String, ByVal y As String) As Boolean
    For i As Integer = 0 To y.Length - 1
        If y(i) = "1"c AndAlso x(i) = "0"c Then
            Return False
        End If
    Next

    Return True
End Function

答案 1 :(得分:1)

如果您将字符串视为二进制数字,则可以将其转换为数字,然后使用按位和运算符,如下所示:

SELECT
    P.Name AS [Playlist Name]
    ,PT.TrackId AS [Track ID]
FROM PlaylistTrack AS [PT]
FULL JOIN Playlist AS [P]
    ON PT.PlaylistId = P.PlaylistId
GROUP BY P.Name, PT.TrackId 
HAVING COUNT(CONCAT(P.Name,PT.TrackId)) > 1
ORDER BY P.Name

,将输出Playlist Name Playlist ID Track ID Audiobooks 6 NULL Movies 7 NULL Music 8 1 Music 8 2 Music 8 3 Music 8 4 ,并为最多64个字符的字符串工作。

或者,在您的评论之后,您可以使用Module Module1 Sub Main() Dim X = "0000111111110111111111110" Dim Y = "0000011111000000000000000" Dim Xb = Convert.ToInt64(X, 2) Dim Yb = Convert.ToInt64(Y, 2) Console.WriteLine((Xb And Yb) = Yb) Console.ReadLine() End Sub End Module ,因为那样可以为数据提供足够的位。

答案 2 :(得分:1)

可以做类似的东西@JoshD上面所说的,但使用MAIL_DRIVER=sendmail MAIL_HOST=sg2plcpnl0003.prod.sin2.secureserver.net MAIL_PORT=465 MAIL_USERNAME=info@ezmoverandrental.com MAIL_PASSWORD='eZia120$' MAIL_ENCRYPTION=ssl 从二进制串到整数转换。

VERSION BUILD=10021450
URL GOTO=https://EXAMPLE.com
TAG POS=3 TYPE=A ATTR=TXT:Funny
TAG POS=1 TYPE=H3 ATTR=TXT:Funny<SP>Dogs<SP>Compilation

答案 3 :(得分:1)

这包括什么其他人已经表明加上用于一次每个比特一个测试。

    Dim s As String = "0000011111000000000000000"
    Dim X As String = "0000111111110111111111110"
    Dim Y As String = "0000011111000000000000000"

    Dim xi As Integer = Convert.ToInt32(X, 2)
    Dim yi As Integer = Convert.ToInt32(Y, 2)


    'check each bit
    For i As Integer = 0 To 24
        Dim msk As Integer = 1 << i
        If (msk And xi) = msk AndAlso (msk And yi) = msk Then
            Debug.WriteLine("Bit {0} on in both", i)
        End If
    Next

    'all bits
    Dim rslt As Integer = xi And yi
    s = Convert.ToString(rslt, 2).PadLeft(25, "0"c)

答案 4 :(得分:-1)

Dim intY As Integer = CInt(Y)    
Dim res As Boolean = (CInt(X) And intY) = intY

将它们转换为整数,按位获取与1匹配的所有实例,然后进行比较以查看Y是否被该比较更改了。如果比较保存的原始Y,其结果将是真。