【问题标题】:What kind of regex should I use for the following template?我应该为以下模板使用哪种正则表达式?
【发布时间】:2016-10-06 05:52:22
【问题描述】:

我正在编写一个 Java 程序来计算一个人的平均工资,并在模板中打印每月扣除额。模板是这样的:

==============BILL==============
|  NAME: xXxX     BRANCH : xxx |
|                              |
|    Month 1 : xxx.xxx         |
|    Month 2 : xxxx.xx         |
|     <other Months>           |
|    Month 12 : xxx.xx         |
|                              |
|     TOTAL : ____________     |
================================

我正在使用以下模式来尝试捕获元素:

//template is stored in string.
String[] lines = msg.split("\n");
Pattern p = Pattern.compile("[xX\\._]+");
for(String line : lines){
    Matcher m = p.matcher(line);
    if(m.find()){
        System.out.println(m.group());
    }
    else{
        System.out.println("no match found...");
    }
}

我得到的输出是这样的:

xXxX
xxx.xxx
xxxx.xx
xxx.xx
____________

但是,我无法匹配 BRANCH 的“xxx”。如何提取该模式?

【问题讨论】:

    标签: java regex matcher


    【解决方案1】:

    改变

    if(m.find()){
        System.out.println(m.group());
    }
    

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

    因为NAMEBRANCH 在同一行。

    Matcher#find() 将在字符串中找到第一个匹配项,而不是所有匹配项。要获得所有匹配项,您必须多次致电find()

    【讨论】:

    • 谢谢!只是一个小的后续问题 - 我如何替换这些匹配的令牌?我对 RegEx 比较陌生,所以如果我听起来容易上当,请原谅我
    • stringToAlter.replace(m.group(),"WhateverAlterContent");
    • 以下是正确的方法吗? for(...){ if(line[i].contains("somePattern")){ line[i] = line[i].replace(m.group(),"myReplacement"); } }
    • String#contains 接受字符模式(精确模式)但不接受正则表达式仅供参考。但总的来说是的,这很好。您可以随时跳过contains 检查并简单地执行replaceAll。它接受正则表达式作为参数,如果不匹配 - 对于您使用的检查,contains 不会被替换 - String#contains 变得多余。
    猜你喜欢
    • 2014-12-10
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 2018-06-08
    • 1970-01-01
    相关资源
    最近更新 更多