.net 这个、那个或其他的正则表达式模式匹配

.net 这个、那个或其他的正则表达式模式匹配,.net,regex,vb.net,pattern-matching,.net,Regex,Vb.net,Pattern Matching,我有一个问题,我正在努力解决: 对于可以是以下任何变体的文本字符串,我应该采取什么步骤提取所需的信息 P09876-01-TP02-005-L-1087-315-802-105-99 P09876-01-TP02-005-L-1087-315-802-105 P09876-01-TP02-005-L-1087-315-802 P09876-01-TP02-005-L-1087-315 P09876-01-TP02-005-L-1087 我需要返回字符串的-L-部分右边的值 我已经有了以下模式:

我有一个问题,我正在努力解决:

对于可以是以下任何变体的文本字符串,我应该采取什么步骤提取所需的信息

  • P09876-01-TP02-005-L-1087-315-802-105-99
  • P09876-01-TP02-005-L-1087-315-802-105
  • P09876-01-TP02-005-L-1087-315-802
  • P09876-01-TP02-005-L-1087-315
  • P09876-01-TP02-005-L-1087
  • 我需要返回字符串的-L-部分右边的值

    我已经有了以下模式:

    (\w{1}\d{5,}-\d{1,}-\w{2,}\d{2,}-\d{3,}-\w-)(\d{1,})-(\d{1,})-(\d{1,})-(\d{1,})-(\d{1,})|(\w{1}\d{5,}-\d{1,}-\w{2,}\d{2,}-\d{3,}-\w-)(\d{1,})-(\d{1,})-(\d{1,})-(\d{1,})|(\w{1}\d{5,}-\d{1,}-\w{2,}\d{2,}-\d{3,}-\w-)(\d{1,})-(\d{1,})-(\d{1,})|(\w{1}\d{5,}-\d{1,}-\w{2,}\d{2,}-\d{3,}-\w-)(\d{1,})-(\d{1,})|(\w{1}\d{5,}-\d{1,}-\w{2,}\d{2,}-\d{3,}-\w-)(\d{1,})
    

    当我输入时,我可以简单地检查上面的模式返回的组号,然后将这些组号视为
    group(1)、group(2)、group(n)
    等吗?

    如果您只需要L值,您只需要获得
    -L-(\d+)
    。它获取-L-as组1后面的数值。或者,如果L值是-L-后面的所有内容,正如Stribizev所说的
    -L-(*)

    编辑:若要以组的形式获取以下所有内容,请尝试
    -L-(\d+)(\d*)?(\d*)?(\d*)?(\d*)?(\d*)
    。这将使您获得以下所有数字,作为组1、2、3


    关于VB.NET中的

    ,使用正则表达式没有意义:

    Dim str20 As String = "P09876-01-TP02-005-L-1087-315-802-105-99"
    Dim idx20 As Integer = str20.LastIndexOf("-L-")
    Dim result20 As String = str20
    If idx20 > -1 Then
       result20 = str20.Substring(idx20 + 3)
       Dim splts = result20.Split("-"c)
    End If
    
    结果:


    我不能完全确定您要搜索的来源是什么。我知道您正在寻找“L”后面的值。但是所有的字符串都遵循这种格式吗?假设使用的是这样,那么使用纯RegExp可以执行以下操作:

    [^L\n]+L-(\d+)-?(\d+)?-(\d+)?-(\d+)?-(\d+)?
    

    其中第一部分涵盖“L”之前的所有内容,不包括新行。第一个数字系列后面的部分是可选的(因此是“?”)。

    FWIW,下面是我的最终解决方案:

    ''' <summary>
    ''' Gets the dimension value from the part number
    ''' </summary>
    ''' <param name="PartNumString">the part number to search</param>
    ''' <param name="GroupNum"></param>
    ''' <returns></returns>
    ''' <remarks>This actually needs to do two things, one is to decide what the pattern is dependant on the Dimension we are searching for, the second is to find the correct group from the matches</remarks>
    Private Function GetDimensionValueFromPartName(PartNumString As String, GroupNum As Integer) As String
        Dim result As String = String.Empty
        Dim pattern As String = "(\w*\d*-\d*-\w*\d*-\d*-\w-)(\d*)-(\d*)-(\d*)-(\d*)-(\d*)|(\w*\d*-\d*-\w*\d*-\d*-\w-)(\d*)-(\d*)-(\d*)-(\d*)|(\w*\d*-\d*-\w*\d*-\d*-\w-)(\d*)-(\d*)-(\d*)|(\w*\d*-\d*-\w*\d*-\d*-\w-)(\d*)-(\d*)|(\w*\d*-\d*-\w*\d*-\d*-\w-)(\d*)|(\w*\d*-\d*-\w*\d*-\d*-)(\d*)-(\d*)-(\d*)-(\d*)-(\d*)|(\w*\d*-\d*-\w*\d*-\d*-)(\d*)-(\d*)-(\d*)-(\d*)|(\w*\d*-\d*-\w*\d*-\d*-)(\d*)-(\d*)-(\d*)|(\w*\d*-\d*-\w*\d*-\d*-)(\d*)-(\d*)|(\w*\d*-\d*-\w*\d*-\d*-)(\d*)|(\w*\d*-\d*-\w*\d*-\d*)|.*(\w*\d*-\d*-)(\d*)-(\d*)-(\d*)-(\d*)-(\d*)|.*(\w*\d*-\d*-)(\d*)-(\d*)-(\d*)-(\d*)|.*(\w*\d*-\d*-)(\d*)-(\d*)-(\d*)|.*(\w*\d*-\d*-)(\d*)-(\d*)|.*(\w*\d*-\d*-)(\d*)|.*(\w*\d*-\d*-\w-)(\d*)-(\d*)-(\d*)-(\d*)-(\d*)|.*(\w*\d*-\d*-\w-)(\d*)-(\d*)-(\d*)-(\d*)|.*(\w*\d*-\d*-\w-)(\d*)-(\d*)-(\d*)|.*(\w*\d*-\d*-\w-)(\d*)-(\d*)|.*(\w*\d*-\d*-\w-)(\d*)"
        Dim Dimensionregex As Regex = New Regex(pattern, RegexOptions.IgnoreCase)
        Dim match As Match = Dimensionregex.Match(PartNumString)
        Dim matchcount As Integer = 0
        Do While match.Success
            matchcount += 1
            Console.WriteLine("Match" & matchcount)
            Dim MatchStart As Integer = 0
            For index = 0 To match.Groups.Count
                If Not match.Groups(index).Value.Contains(PartNumString) And Not match.Groups(index).Value = String.Empty Then
                    MatchStart = index
                    Exit For
                End If
            Next
            If Not match.Groups(MatchStart + GroupNum).Value = String.Empty Then
                result = match.Groups(MatchStart + GroupNum).Value
            Else
                result = "-"
            End If
    
            match = match.NextMatch()
        Loop
        Return result
    End Function
    
    “”
    ''从零件号中获取尺寸值
    ''' 
    ''要搜索的零件号
    ''' 
    ''' 
    ''这实际上需要做两件事,一是决定模式依赖于我们正在搜索的维度,二是从匹配中找到正确的组
    私有函数GetDimensionValueFromPartName(PartNumString作为字符串,GroupNum作为整数)作为字符串
    Dim结果为String=String.Empty
    (d)现(d)7——(d)d——(d)d——(d)d——(d—(d)d—(d)d—(d)d——(d)d——(d)d——(d)d—(d)d—(d)担任担任担任担任字符串字符串串串串串串串串担任担任担任担任担任担任担任担任字符串字符串的政府手手手手手手手手手手手手手手手留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留留*)-(\ d*)-(\w*\d*-\d*-\w*\d*-\w-(\d*)-(\w*\d*-\d*-\w*\d*-\d*-)(\d*-(\d*)-(\d*-(\d*)-(\d*-)(\w*\d*-\d*-\d*-(\d*-)(\d*-)(\d*-)(\d*-)-(4)第4 4 4 4 4 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 4 4 4 4 4 4 4 4 4 4 4 7 7 7 7 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 7 7 7 7 7 7 7 7)4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4)(\w*\d*-\d*-)(\d*-)(\d*-)(\d*-)(\d*-)(\w*\d*-\d*-)(\d*-)(\d*-(\d*-)(\w*\d*-\d*-)(\d*-(\d*-)(\w*\d*-\d*-)(\d*-)(\d*-)(\w*\d*-\d*-)(\d*-\d*-)(\d*-)(\d*-)|.*(\w*\d*-\d*-\w-(\d*)-(\d*)-(\d*)-(\d*)-(\w*\d*-\d*-\w-(\d*)-(\d*)-(\w*\d*-\d*-\w-(\d*)-(\d*)-(\d*).*(\w*\d*-\d*-\w-(\d*)”
    Dim Dimensionregex As Regex=新的Regex(模式,RegexOptions.IgnoreCase)
    尺寸匹配为匹配=尺寸正则表达式匹配(PartNumString)
    Dim matchcount为整数=0
    边做边比赛。成功
    匹配计数+=1
    Console.WriteLine(“匹配”和匹配计数)
    Dim MatchStart作为整数=0
    对于索引=0,匹配.Groups.Count
    如果不匹配.Groups(index).Value.Contains(PartNumString)和不匹配.Groups(index).Value=String.Empty,则
    匹配开始=索引
    退出
    如果结束
    下一个
    如果不匹配.Groups(MatchStart+GroupNum).Value=String.Empty,则
    结果=match.Groups(MatchStart+GroupNum).Value
    其他的
    结果=“-”
    如果结束
    match=match.NextMatch()
    环
    返回结果
    端函数
    

    感谢您的建议或改进。(是的,现在的模式非常长!)

    这些是单独的字符串,对吗?还有您的正则表达式“eats”它们都是一个字符串。您是否只需要并获取组1值?您是否还需要将与这些模式中的任何一个匹配的字符串查找到一个大文本或字符串列表中?或者您处理的所有字符串都与这些格式中的一种匹配,您只需识别这些片段?
    {1}
    是多余的,您可以删除它;它只会使
    正则表达式
    混乱;
    {1,}
    +
    相同(如果您使用的语言或工具支持它)使用
    +
    反而使
    regex
    更具可读性您在哪里使用regex?什么是工具/编程语言?@stribizev:VB.NET是语言,visualstudio Express 2015是IDE-是的,它们是独立的字符串。当我从这个或那个模式中获得匹配项时,我需要获取用于llow-如果我以上面列表中的项目1为例,它将分解为{Projectinfo}-{PartNum Family}-{L-or-R}-{DimensionA}-{DimensionB}-{DimensionC}-{DimensionD}@AlexF1980-请参见编辑?s这些组都会乱七八糟的。我认为正则表达式在这里不是一个好方法。谢谢!当我在下面回复@ClasG时,我确实需要将字符串的-L-部分后面的数字组分解。使用
    -
    splt
    将找到的匹配项拆分为5个元素,您可以使用它们初始化任何类。这就是非常好@Stribizev,谢谢。假设我有另一个没有-L-的变体,例如:P09876-01-TP04-003-220,其中我需要在字符串的TP04-003部分之后拆分所有内容,然后呢?你怎么知道它在
    TP04-003
    之后?实际的规格/要求是什么?无论如何,在这种情况下你有一个
    -分隔字符串。使用
    拆分
    ,然后分析结果数组中的元素数,并根据该数进一步赋值,我猜,如果输入也包含
    -L
    如果str20.contains(“-L-”)