0

为了进行某种“模糊”匹配,我需要从用户可以输入的字符串中提取子短语的所有变体。

我尝试过的几个例子似乎并没有完成全部工作 - 它们似乎循环并抓取仅并排但不分布在各处的子短语 - 例如:

原始输入 - “重型电缆卷筒” - 在获得 2 个单词子短语时给出:

重负

电缆

电缆卷筒

但我也想要:

重型电缆

沉重的卷轴

责任卷轴

因此,实际上在构建子短语时会“遗漏”单词。理想情况下,我需要为 4 个单词的原始输入返回 3 和 2 个单词的子短语,为 5 个单词的输入返回 4、3 和 2 个等等。

For i As Integer = lst.Count To 1 Step -1 
    For j As Integer = 1 To i 
        Dim sb As New StringBuilder 
        sb.Append("( ") 
        For k As Integer = 0 To (lst.Count - i) 
            sb.Append(lst(j + k - 1) & ":" & j & ":" & k & ":" & i & " ") 
            Next 
        sb.Append(")") 
        rlst.Add(sb.ToString()) 
    Next 
Next
4

1 回答 1

1

两个嵌套的 for 循环将对两个单词的组合执行此操作

Dim s = "heavy duty cable reel".Split()

For i As Integer = 0 To s.Length - 2
    For k As Integer = i + 1 To s.Length - 1
        Console.WriteLine(s(i) + " " + s(k))
    Next
Next

输出是

重负
重型电缆
沉重的卷轴
电缆
责任卷轴
电缆卷筒

更新

这是一个将所有短语长度从 2 到单词数 - 1 的版本。我为此创建了一个类。

Public Class PhraseBuilder
    Private words As String()
    Private phrases As List(Of String)

    Public Function GetList(ByVal initialPhrase As String) As List(Of String)
        words = initialPhrase.Split()
        phrases = New List(Of String)()
        For phraseLength As Integer = 2 To words.Length - 1
            AddPhrases("", 0, phraseLength)
        Next
        Return phrases
    End Function

    Private Sub AddPhrases(ByVal phrase As String, ByVal start As Integer,
                           ByVal wordCount As Integer)
        If wordCount >= 1 Then
            For i As Integer = start To words.Length - wordCount
                AddPhrases(phrase + " " + words(i), i + 1, wordCount - 1)
            Next i
        Else
            phrases.Add(phrase.TrimStart())
        End If
    End Sub
End Class

你可以用

Sub PrintPhrases()
    Dim phraseBuilder = New PhraseBuilder()
    Dim phrases = phraseBuilder.GetList("heavy duty cable reel")
    For Each phrase As String In phrases
        Console.WriteLine(phrase)
    Next
End Sub

结果将是

重负
重型电缆
沉重的卷轴
电缆
责任卷轴
电缆卷筒
重型电缆
重型卷轴
重型电缆卷筒
电缆卷筒

请注意,我在这里使用了递归。递归允许将 for 语句嵌套到任意深度。我没有使用 a StringBuilder,因为我们必须创建短语开头的副本。使用自动执行此操作的字符串更容易完成,因为它们是不可变的。没有简单的方法来克隆StringBuilder.

于 2012-11-29T17:38:35.407 回答