如何从Salesforce的字符串中提取子字符串

时间:2018-11-09 05:26:59

标签: regex string salesforce

子字符串格式

PO # 123456
PO# 123456
PO #123456
P.O. # 123456
P.O.# 123456
P.O. #123456

我们必须从字符串notes__c字段中过滤子字符串(123456)并将其放在test__c字段中。我用过Regex来触发,它涵盖了除第一个PO#123456之外的所有内容

我的密码

if(oOrder.Notes__c != null) {
        Pattern p = Pattern.compile('PO # (\\S+)\\s');
        Pattern q = Pattern.compile('PO# (\\S+)\\s');
        Pattern r = Pattern.compile('PO #(\\S+)\\s');
        Pattern s = Pattern.compile('P.O. # (\\S+)\\s');
        Pattern t = Pattern.compile('P.O.# (\\S+)\\s');
        Pattern u = Pattern.compile('P.O. #(\\S+)\\s');
        Matcher pm = p.matcher(oOrder.Notes__c);
        Matcher qm = q.matcher(oOrder.Notes__c);
        Matcher rm = r.matcher(oOrder.Notes__c);
        Matcher sm = s.matcher(oOrder.Notes__c);
        Matcher tm = t.matcher(oOrder.Notes__c);
        Matcher um = u.matcher(oOrder.Notes__c);

        system.debug('find = ' +pm.find()); 
        if (pm.find()){
          string res =  pm.group(1);
          oOrder.test__c = res;
        } 
        if(qm.find()){
          string res1 =  qm.group(1);
          oOrder.test__c = res1;
        }
        if(rm.find()){
          string res2 =  rm.group(1);
          oOrder.test__c = res2;
        }
        if(sm.find()){
          string res3 =  sm.group(1);
          oOrder.test__c = res3;
        }
        if(tm.find()){
          string res4 =  tm.group(1);
          oOrder.test__c = res4;
        }
        if(um.find()){
          string res5 =  um.group(1);
          oOrder.test__c = res5;
        }
      } 

如果还有其他方法(例如字符串方法) 请建议

1 个答案:

答案 0 :(得分:0)

您可以使用单个正则表达式来捕获组中的数字:

(?<!\\S)P(?:O|\\.O\\.)\\h*#\\h*(\\d+)

Regex demo

说明

  • (?<!\S)后面的否定断言断言左侧不是非空白字符
  • P字面上匹配
  • (?:O|\.O\.)匹配O或.O。
  • \h*与水平空白匹配零次或多次
  • #字面上匹配
  • \h*匹配零个或多个水平空白
  • (\d+)分组捕获1位以上的数字

Demo