用于提取帐户说明,编号和余额的两种不同格式的数据,暂时忽略帐户类型和可用余额
---------------------- 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数据格式的差异是
我尝试了很多正则表达式,但只有下面的那个描述了可能的格式。我尝试过使用或者无法使用正确的正则表达式
以下是第一种格式:
@"(
)(\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
答案 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)
- USD
或Balance
文字\W*
- 0 +字符不是字母字符(字母,数字和下划线除外)(?<bal>[\d.]+)
- 群组“bal”捕获1位数或点数。请注意,.*?
并不总是让您抓住2个子模式之间的最小窗口,因为回溯将尝试适应模式中的所有必需捕获组。如果您的输入是结构化的,您应该考虑使用基于否定字符类和简写的更多限制模式,例如\w
,\d
,\S
。