再一次,正则表达式几乎没有问题

时间:2011-03-09 20:39:23

标签: java regex

所以我有一点问题

这是我的文字

AFTER_2011/03/01 GREATER_2004_NOT

我想要AFTER和GREATER,所以我有以下正则表达式:

[A-Z]{2,}\\B

起初没关系,我得到了,但第二次我得到整条线。 我试过加'?'之前和之后变得不情愿,我也试过\ G把它变成全球性的。 没有什么对我有用。在其他时候我使用正则表达式它已经自动开始搜索最后停止的地方,但不是这次。 有什么建议吗?

编辑:所以这是我写的代码:

 private void checkFilterNames(String[] sections){

    _validityPatt = Pattern.compile("[A-Z]{2,}\\B");
    boolean foundName;

    for (int i=0; i<sections.length; i++){  
        _checker = _validityPatt.matcher(sections[i]);
        _checker.find();
        String currentName = sections[i].substring(1, _checker.end());
        while (!currentName.equals("ACTION")){
            foundName = false;
            System.out.println("checking "+currentName);
            for (int k=0; k<FilterManager.getNames().length; k++){
                if (currentName.equals(FilterManager.getNames()[k])){
                    foundName = true;
                    break;
                }
            }
            if (!foundName){
                System.out.println("no such FILTER/ACTION/ORDER "+currentName);
                System.exit(-1);
            }
            _checker.find();
            currentName = sections[i].substring(1, _checker.end());
        }

    }

所以这就是代码。我想要分离AFTER然后GREATER。我在第一个循环之前遇到一个小错误,我得到'AFTER'然后我得到'AFTER_2011 / 03/01大''

2 个答案:

答案 0 :(得分:2)

currentName = sections[i].substring(1, _checker.end());

应该是:

currentName = sections[i].substring(_checker.start(), _checker.end());

我测试了你的正则表达式,没关系。我认为你得到错误字符串的原因是因为你总是从索引1获得子串。

第一次迭代(假设基于1的索引):

  • start == 1,end == 6 .substring(1,end)
  • 是'AFTER',所以你很好

第二次迭代

  • start == 18,end == 25
  • .substring(1,end)是 'AFTER_2011 / 03/01大''结束了 index是好的,但是起始索引是 不
  • .substring(start,end)是'GREATER', 这就是你想要的我相信

答案 1 :(得分:0)

不太清楚。你可以试试像这样的正则表达式

([A-Z]{2,})_