用正则表达式 删除字符串中重复的字符串

时间:2022-02-01 06:22:47

1111
2222
3333
1111
2222
3333
用换行符把字符串隔开
删除重复项后得到如下答案:
1111
2222
3333

求正则表达式

3 个解决方案

#1


Dictionary 对象
               

描述

对象,用于存储数据关键字和条目对。

语法

Scripting.Dictionary

说明

Dictionary 对象与 PERL 关联数组等价。可以是任何形式的数据的条目被存储在数组中。每个条目都与一个唯一的关键字相关联。该关键字用来检索单个条目,通常是整数或字符串,可以是除数组外的任何类型。

下面的代码举例说明了如何创建一个 Dictionary 对象:

Dim d                   '创建一个变量
Set d = CreateObject(Scripting.Dictionary)
d.Add "a", "Athens"     '添加一些关键字和条目
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
...

#2


正则不是万能的。别为了用正则而正则。这个场景是正则是无能为力的。 楼上说的字典方法是一个很有效并且快速筛选重复的办法。

下面提供一个我之前写的VBS脚本。保存到文本文件然后后缀名改成vbs就可以了

'描述:直接将要筛选相同行的文件拖到这个vbs文件上即可
'作者:sysdzw
'邮箱:sysdzw@163.com
'QQ:171977759
'12:51 2009-7-12
Dim strFileSource, strFileResult,t1

On Error Resume Next
strFileSource = wscript.Arguments(0)
strFileResult = Left(strFileSource, InStrRev(strFileSource, ".") - 1) & "_out.txt"

If strFileSource <> "" Then
    t1=Time()
    Set fso = CreateObject("scripting.filesystemobject")
    Set stream = fso.opentextfile(strFileSource, 1, False)
    Set stream2 = fso.opentextfile(strFileResult, 2, True)

    Set dict = CreateObject("scripting.dictionary")


    While Not stream.atendofstream
        Line = stream.readline
        If Not dict.Exists(Line) Then
            Call dict.Add(Line, Null)
            Call stream2.writeline(Line)
        End If
    Wend
    
    stream.Close
    stream2.Close
    MsgBox "处理完毕!总计耗时 " & DateDiff("s",t1,Time) & " 秒。" & vbCrLf & vbCrLf & strFileResult, vbInformation, "Del Same Line QQ:171977759"
Else
    MsgBox "no file!", vbExclamation, "Del Same Line QQ:171977759"
End If

#3


用正则表达式 删除字符串中重复的字符串

Option Explicit

Private Sub Command1_Click()
    List1.Clear
    Dim re As New RegExp
    Dim ms As MatchCollection, m As Match, i As Integer, j As Integer
    With re
        .MultiLine = True
        .Global = True
        .IgnoreCase = True
        .Pattern = "([^\n]+\n)"
        Set ms = .Execute(Text1)
        For i = 0 To ms.Count - 1
            For j = 0 To i - 1
                If ms(i) = ms(j) Then Exit For
            Next
            If j = i Then List1.AddItem ms(i)
        Next
    End With
    Set re = Nothing
End Sub

#1


Dictionary 对象
               

描述

对象,用于存储数据关键字和条目对。

语法

Scripting.Dictionary

说明

Dictionary 对象与 PERL 关联数组等价。可以是任何形式的数据的条目被存储在数组中。每个条目都与一个唯一的关键字相关联。该关键字用来检索单个条目,通常是整数或字符串,可以是除数组外的任何类型。

下面的代码举例说明了如何创建一个 Dictionary 对象:

Dim d                   '创建一个变量
Set d = CreateObject(Scripting.Dictionary)
d.Add "a", "Athens"     '添加一些关键字和条目
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
...

#2


正则不是万能的。别为了用正则而正则。这个场景是正则是无能为力的。 楼上说的字典方法是一个很有效并且快速筛选重复的办法。

下面提供一个我之前写的VBS脚本。保存到文本文件然后后缀名改成vbs就可以了

'描述:直接将要筛选相同行的文件拖到这个vbs文件上即可
'作者:sysdzw
'邮箱:sysdzw@163.com
'QQ:171977759
'12:51 2009-7-12
Dim strFileSource, strFileResult,t1

On Error Resume Next
strFileSource = wscript.Arguments(0)
strFileResult = Left(strFileSource, InStrRev(strFileSource, ".") - 1) & "_out.txt"

If strFileSource <> "" Then
    t1=Time()
    Set fso = CreateObject("scripting.filesystemobject")
    Set stream = fso.opentextfile(strFileSource, 1, False)
    Set stream2 = fso.opentextfile(strFileResult, 2, True)

    Set dict = CreateObject("scripting.dictionary")


    While Not stream.atendofstream
        Line = stream.readline
        If Not dict.Exists(Line) Then
            Call dict.Add(Line, Null)
            Call stream2.writeline(Line)
        End If
    Wend
    
    stream.Close
    stream2.Close
    MsgBox "处理完毕!总计耗时 " & DateDiff("s",t1,Time) & " 秒。" & vbCrLf & vbCrLf & strFileResult, vbInformation, "Del Same Line QQ:171977759"
Else
    MsgBox "no file!", vbExclamation, "Del Same Line QQ:171977759"
End If

#3


用正则表达式 删除字符串中重复的字符串

Option Explicit

Private Sub Command1_Click()
    List1.Clear
    Dim re As New RegExp
    Dim ms As MatchCollection, m As Match, i As Integer, j As Integer
    With re
        .MultiLine = True
        .Global = True
        .IgnoreCase = True
        .Pattern = "([^\n]+\n)"
        Set ms = .Execute(Text1)
        For i = 0 To ms.Count - 1
            For j = 0 To i - 1
                If ms(i) = ms(j) Then Exit For
            Next
            If j = i Then List1.AddItem ms(i)
        Next
    End With
    Set re = Nothing
End Sub