是否可以使用一个正则表达式从2种数据格式中提取

时间:2016-07-20 01:20:34

标签: .net regex

用于提取帐户说明,编号和余额的两种不同格式的数据,暂时忽略帐户类型和可用余额

---------------------- 160215 ( no Available balance)::::::::::::::::

                 U$ GG Hi interest2 - Savings 09999-9999385
Savings 09999-9999385 USD $9.00
-- or
U$ GG Hi interest2 - Savings 09999-9999385
Savings 09999-9999385 USD $9.00
---------------------- 160207 (has avail Balance):::::

                 U$ GG Hi interest3  Savings 09999-4500399 Available Balance: $5000.00 USD
$4500.00 USD

------- or:
U$ GG Hi interest3  Savings 09999-4500399 Available Balance: $5000.00 USD  $4500.00 USD

总之,2数据格式的差异是

  • 第二个fmt在desc。,acct type,acct#之后在相同的第一条逻辑行上有可用的余额
  • 第一个fmt只有acct类型,acct#在第一个逻辑行描述之后但是有acct类型,acct#在第二行上重复acct balance curency和第二个逻辑行中的实际余额

我尝试了很多正则表达式,但只有下面的那个描述了可能的格式。我尝试过使用或者无法使用正确的正则表达式

以下是第一种格式:

@"(
)(\t| ){8,18}(?<desc>
    U[$]
    (\s
        [a-z',._()]{0,30}
        (
            [a-z]
            [0-9]{0,2}
        ){0,1}
    ){1,10}
)\s([-]\s((Chequing)|(Savings)|(\w\w\w+))\s+(\d+[-]\d+)\s+){0,1}[
]((Chequing)|(Savings)|(\w\w\w+))\s+(?<acctNumb>\d+[-]\d+)\s+\w\w\w\s+\$
(?<bal>
    \d{1,3}
    (,\d\d\d){0,4}
    \.
    \d{1,2}
)\b
"

使用Regex选项IgnoreCase,ExplicitCapture,Multi-line,IgnorePatternWhitespace

1 个答案:

答案 0 :(得分:1)

您可以使用

(?<desc>\bU\$.*?)(?:\s*-+\s*)?Savings\s*(?<acnt>\d+-\d+).*?(?:USD|Balance)\W*(?<bal>[\d.]+)

请参阅regex demo

将它与ignorecase和singleline修饰符一起使用。

<强>详情:

  • (?<desc>\bU\$.*?) - 在字边界之后捕获U的组“desc”,$然后捕获任何0+字符(带.*?),尽可能少直至第一......
  • (?:\s*-+\s*)? - 0 +空格,1 + -和0 +空格的可选序列(此组可能是多余的,因为只有在U$紧跟时才会匹配)< / LI>
  • Savings\s* - Savings后面有0 +空格
  • (?<acnt>\d+-\d+) - 群组“acnt”捕获1位数字,-和1+位数
  • .*? - 在第一个
  • 之前尽可能少的零个或多个字符
  • (?:USD|Balance) - USDBalance文字
  • \W* - 0 +字符不是字母字符(字母,数字和下划线除外)
  • (?<bal>[\d.]+) - 群组“bal”捕获1位数或点数。

请注意,.*?并不总是让您抓住2个子模式之间的最小窗口,因为回溯将尝试适应模式中的所有必需捕获组。如果您的输入是结构化的,您应该考虑使用基于否定字符类和简写的更多限制模式,例如\w\d\S