1

我实际上是在尝试使用正则表达式提取美元金额,但无法弄清楚如何仅提取美元金额,其数字可能会有所不同。下面是我要提取的金额字段的示例,该字段始终位于字段的中间:

<field1>05/14/2013</field1><amount>3,100,000.00</amount><field3>026002561</field3>

我目前拥有的:(<amount>.*</amount>这个结果没有让我得到我想要的)

对于这个领域,我只想提取 310 万这个数字。围绕美元数字的结构(类似于 html)将始终相同。任何帮助表示赞赏。

4

2 回答 2

-1

使用 Excel VBA 提取您的捕获组。

VBA 代码

Function TestRegExp(ByVal myString As String, _
                      ByVal myPattern As String, _
                      Optional seperator As String = "") As String
   Dim objRegExp As RegExp
   Dim colMatches As MatchCollection
   Dim RetStr As String

   Set objRegExp = New RegExp
   objRegExp.Pattern = myPattern
   objRegExp.IgnoreCase = True
   objRegExp.Global = True
   seperator = "|"

   If (objRegExp.Test(myString) = True) Then
    Set colMatches = objRegExp.Execute(myString)
    For i = 0 To colMatches.Count - 1
        For j = 0 To colMatches.Item(i).SubMatches.Count - 1
            If (RetStr <> "") Then
                RetStr = RetStr & seperator & colMatches.Item(i).SubMatches.Item(j)
            Else
                RetStr = colMatches.Item(i).SubMatches.Item(j)
            End If
        Next
    Next
   Else
    RetStr = "No Match"
   End If
   TestRegExp = RetStr
End Function

Excel
并且在 Excel 中测试这一点的函数是:

=TestRegExp(B2,"<amount>([^<]*)<\/amount>")

单元格 B2 有您的文本:

<field1>05/14/2013</field1><amount>3,100,000.00</amount><field3>026002561</field3>
Output: 3,100,000

或者

<field1>05/14/2013</field1><amount>3,100,000.00</amount><field3>026002561</field3><amount>999</amount>  
Output: 3,100,000|999

请注意:

  1. 使用.*?而不是.*. 这有助于解决多个数量标签问题,因为它由于问号而延迟解析。您可以在代码中选择分隔符。
  2. 诀窍是使用子匹配来获取捕获组
于 2013-06-03T19:28:00.837 回答
-1

Excel

由于您在 excel 中执行此操作,因此您可能需要考虑使用此公式

=MID(B1,SEARCH("<amount>",B1)+8,SEARCH("</amount>",B1)-(SEARCH("<amount>",B1) + 8))

  • B1= 输入字符串
  • +8补偿字符串的宽度<amount>
  • C列显示使用的公式

在此处输入图像描述

正则表达式

如果您使用 VBA 和正则表达式执行此操作,则可以使用正则表达式:<(amount)\b[^>]*>([^<]*)<\/\1>

在此处输入图像描述

此 VB.net 示例仅用于显示正则表达式如何使用金额标签中的每个美元值填充组 3。

Imports System.Text.RegularExpressions
Module Module1
  Sub Main()
    Dim sourcestring as String = "<field1>05/14/2013</field1><amount>3,100,000.00</amount><field3>026002561</field3>
    <field1>05/14/2013</field1><amount>4,444,444.00</amount><field3>026002561</field3>"
    Dim re As Regex = New Regex("<(amount)\b[^>]*>([^<]*)<\/\1>",RegexOptions.IgnoreCase OR RegexOptions.Multiline OR RegexOptions.Singleline)
    Dim mc as MatchCollection = re.Matches(sourcestring)
    Dim mIdx as Integer = 0
    For each m as Match in mc
      For groupIdx As Integer = 0 To m.Groups.Count - 1
        Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames(groupIdx), m.Groups(groupIdx).Value)
      Next
      mIdx=mIdx+1
    Next
  End Sub
End Module

$matches Array:
(
    [0] => Array
        (
            [0] => <amount>3,100,000.00</amount>
            [1] => <amount>4,444,444.00</amount>
        )

    [1] => Array
        (
            [0] => amount
            [1] => amount
        )

    [2] => Array
        (
            [0] => 3,100,000.00
            [1] => 4,444,444.00
        )

)
于 2013-06-03T18:42:22.693 回答