正则表达式将组视为字符串

时间:2019-07-19 18:35:39

标签: regex vb.net

我有一个正则表达式,它使用另一个正则表达式中的匹配值。但是,当我测试正则表达式时,它并没有捕获第二个正则表达式组。而是将组视为字符串。我如何获取此正则表达式以输出组?

Private Sub CreateGraphicsFunction(sender As Object, e As EventArgs)
    Dim Regex = New Regex("infoEntityIdent=""(ICN.+?)[""].*?[>]")

    Dim ICNFiles = Directory.EnumerateFiles(MoveToPath, "*.*", SearchOption.AllDirectories)

    For Each tFile In ICNFiles
        Dim input = File.ReadAllText(tFile)

        Dim match = Regex.Match(input)
        If match.Success Then
            GraphicList.Add(match.Groups(1).Value)
            Dim Regex2 = New Regex("<!ENTITY " & match.Groups(1).Value & "  SYSTEM ""(ICN.+?[.]\w.+?)[""]")
            Debug.Write(Regex2)    ' outputs !ENTITY ICN-GAASIB0-00-051105-A-0YJB5-00005-A-001-01  SYSTEM "(ICN.+?[.]\w.+)["]
            Dim sysFileMatch = Regex2.Match(input)

            If sysFileMatch.Success Then
                ICNList.Add(sysFileMatch.Groups(1).Value)
                Debug.Write("found ICN " & sysFileMatch.Groups(1).Value)
            End If
        End If
    Next
End Sub

示例 第一个Regex捕获ICN编号。例如 使用此正则表达式可捕获ICN号。

New Regex("infoEntityIdent=""(ICN.+?)[""].*?[>]")

从那里,我想使用在组中捕获的值再次遍历文件,并找到与ext匹配的ICN。例如 因此,我使用新正则表达式中第一个正则表达式中的捕获组来获取带有扩展名的ICN号。

New Regex("<!ENTITY " & match.Groups(1).Value & "  SYSTEM ""(ICN.+?[.]\w.+?)[""]")

当我测试此正则表达式时,它给了我

!ENTITY ICN-GAASIB0-00-051105-A-0YJB5-00005-A-001-01  SYSTEM "(ICN.+?[.]\w.+)["]

它忽略了第二个Regex分组,而是将其视为字符串的一部分,而不是用作组。我想要的是在SYSTEM之后带有扩展名的ICN号码

最新代码示例以尝试使其正常工作

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim Files = Directory.EnumerateFiles(MovePath, "*.*", SearchOption.AllDirectories)

    For Each tFile In Files
        Dim input = File.ReadAllText(tFile)
        Dim strREGEX = New Regex("(?=[\S\s]*?infoEntityIdent\s*=\s*""\s*(ICN[\S\s]+?)\s*""[\S\s]*?>)[\S\s]*?<!ENTITY\s+\1\s+SYSTEM\s+""\s*(ICN[\S\s]+?\.\w[\S\s]+?)\s*")
        Dim match = strREGEX.Match(tFile)
        If match.Success Then
            Debug.Write(match.Groups(2).Value)
        Else
            Debug.Write(match.Groups(2).Value & " was not found")
        End If
    Next
End Sub

2 个答案:

答案 0 :(得分:1)

您很可能希望从第一次搜索中“转义”您的“未知”结果,以便能够在新的正则表达式中使用它。

类似的东西:

Dim EscapedSearchValue As String = Regex.Escape(match.Groups(1).Value)
Dim Regex2 = New Regex("<!ENTITY " & EscapedSearchValue & "  SYSTEM ""(ICN.+?[.]\w.+?)[""]")

请参见Regex.Escape(String) Method

答案 1 :(得分:1)

将两个正则表达式合并为一个正则表达式。
这避免了人为干预错误的麻烦。

这是将您的实际正则表达式合并为一个正则表达式。
我已经对其进行了调整,现在它是一个很好的正则表达式。
如果不匹配,我无法对其进行检查,您永远不会
发布了目标字符串。

原始:(?=[\S\s]*?infoEntityIdent\s*=\s*"\s*(ICN[\S\s]+?)\s*"[\S\s]*?>)[\S\s]*?<!ENTITY\s+\1\s+SYSTEM\s+"\s*(ICN[\S\s]+?\.\w[\S\s]+?)\s*"

字符串:@"(?=[\S\s]*?infoEntityIdent\s*=\s*""\s*(ICN[\S\s]+?)\s*""[\S\s]*?>)[\S\s]*?<!ENTITY\s+\1\s+SYSTEM\s+""\s*(ICN[\S\s]+?\.\w[\S\s]+?)\s*"""

格式化并解释:

 (?=                           # Look ahead to find the ID ICN
      [\S\s]*? 
      infoEntityIdent \s* = \s* 
      "
      \s* 
      ( ICN [\S\s]+? )              # (1), Entity IDent ICN
      \s* 
      " 
      [\S\s]*? >
 )
                               # Consume now:
 [\S\s]*?                      # Find the ID ICN inside an ENTITY
 <!ENTITY \s+ 
 \1                            # Back reference to Entity IDent ICN
 \s+ SYSTEM \s+ 
 "
 \s* 
 (                             # (2 start), Some other ICN junk
      ICN
      [\S\s]+? 
      \. 
      \w 
      [\S\s]+? 
 )                             # (2 end)
 \s* 
 "