首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从SMS Regex中获取余额或可用金额

如何从SMS Regex中获取余额或可用金额
EN

Stack Overflow用户
提问于 2021-11-05 20:30:41
回答 3查看 187关注 0票数 1

我想从短信中提取余额

我的短信内容是

代码语言:javascript
复制
account ending with ********9415 has been credited with Rs. 5000. Updated account balance is Rs. 13086.18

Your card transaction of Rs.417 is successful. Your updated credit balance is Rs.78,468

Dear Cardmember, payment of Rs.7657.00 has been received towards your Bank Credit Card ending with 3459 on 12-11-2020 through NEFT. Payment is subject to realisation. Your available Credit limit now is Rs. 173281.31.

到目前为止这是我的代码

代码语言:javascript
复制
(?i)(?:\sbalance\s*)([A-Za-z0-9]+\s[A-Za-z0-9]+)
(?i)(?:\scredit limit\s*)([A-Za-z0-9]+\s[A-Za-z0-9]+)

那么如何从上面的短信中获取金额呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-11-05 21:19:24

如果数据始终采用这种格式,则可以使用捕获组并匹配Rs。从示例数据:后面跟着chars and和空格:

代码语言:javascript
复制
(?i)\b(?:balance|credit\s+limit)\s+[A-Za-z]+(?:\s+[A-Za-z]+)*\s+Rs\.\s*(\d+(?:[.,]\d+)*)
  • 不区分大小写匹配的行修饰符中的(?i)
  • \b(?:balance|credit\s+limit)匹配2种备选方案之一
  • \s+[A-Za-z]+匹配1+空格字符和1+字符A
  • (?:\s+[A-Za-z]+)*可选择地重复前面的模式,前面是1+空格字符
  • \s+Rs\.\s*匹配1+空格字符和Rs.
  • (\d+(?:[.,]\d+)*)捕获组1中的.,或1+数字可选重复的数字。

请看regex演示 \ Java演示

代码语言:javascript
复制
String regex = "(?i)\\b(?:balance|credit\\s+limit)\\s+[A-Za-z]+(?:\\s+[A-Za-z]+)*\\s+Rs\\.\\s*(\\d+(?:[.,]\\d+)*)";
String string = "account ending with ********9415 has been credited with Rs. 5000. Updated account balance is Rs. 13086.18\n\n"
+ "Your card transaction of Rs.417 is successful. Your updated credit balance is Rs.78,468\n\n"
+ "Dear Cardmember, payment of Rs.7657.00 has been received towards your Bank Credit Card ending with 3459 on 12-11-2020 through NEFT. Payment is subject to realisation. Your available Credit limit now is Rs. 173281.31.";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println(matcher.group(1));
}

输出

代码语言:javascript
复制
13086.18
78,468
173281.31
票数 0
EN

Stack Overflow用户

发布于 2021-11-05 21:18:11

您可以使用

代码语言:javascript
复制
(?i)\b(?:balance|credit\s+limit)\D+(\d+(?:[.,]\d+)?)

regex演示。详细信息

  • (?i) -不区分大小写的嵌入式标志选项
  • \b -一个单词边界
  • (?:balance|credit\s+limit) -具有任意一个或多个空白空间的balancecredit limit
  • \D+ -一个或多个非数字字符
  • (\d+(?:[.,]\d+)?) -第1组(需要获取的值):一个或多个数字,然后是一个可选的.,序列和一个或多个数字。如果可能有几个点/逗号,则用?替换为*

Java演示

代码语言:javascript
复制
String regex = "(?i)\\b(?:balance|credit\\s+limit)\\D+(\\d+(?:[.,]\\d+)?)";
String text = "account ending with ********9415 has been credited with Rs. 5000. Updated account balance is Rs. 13086.18\n\nYour card transaction of Rs.417 is successful. Your updated credit balance is Rs.78,468\n\nDear Cardmember, payment of Rs.7657.00 has been received towards your Bank Credit Card ending with 3459 on 12-11-2020 through NEFT. Payment is subject to realisation. Your available Credit limit now is Rs. 173281.31.";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
while (matcher.find()){
    System.out.println(matcher.group(1)); 
} 

输出:

代码语言:javascript
复制
13086.18
78,468
173281.31
票数 1
EN

Stack Overflow用户

发布于 2021-11-05 20:58:33

这里最好避免编写复杂的regexp。很容易在其中犯错误,这样的错误很难调试。

我们所能做的是进行一系列字符串分裂,以简化问题,并将其转化为一系列较小的子问题。

  1. 首先替换“Rs”。带有"XXX“的子字符串。我们需要这样做,以删除Rs.中的点,以便以后的.可以用作拆分令牌。
  2. 将“”上的字符串拆分。符号现在,并保存到数组‘句子’
  3. 对于sentences数组中的每个字符串,只选择"XXX“部分之后的所有内容。这将给你的价格字符串"32.12“
  4. 现在您只需使用Double.valueOf()将其转换为一个数字即可。

与使用regexp的代码相比,维护和理解这样的代码要容易得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69858945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档