零宽度RegEx在Java中不匹配

时间:2016-04-17 15:18:41

标签: java regex

我正在研究零宽度RegEx。首先,我在http://testregex.com/测试我的模式和文字,效果很好。然后我在我的Java程序中测试它们,但它们不匹配。所以我想说明问题的原因。任何回复将不胜感激。谢谢!

pattern:`\w*(?=ing)`
  

文本:I’m singing while you’re dancing

Java代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegexDemo {

  public static void main(String[] args) {
    RegexDemo demo = new RegexDemo();
    System.out.printf("%b%n", demo.zeroWidthAssertionEarly());
  }

  public boolean zeroWidthAssertionEarly()  
  {  
    String reg="\\w*(?=ing)";
    String word = "I’m singing while you’re dancing";
    boolean tem=false;  

    Pattern pattern = Pattern.compile(reg);  
    Matcher matcher = pattern.matcher(word);  

    tem = matcher.matches(); 

    return tem;  
  } 
}

提前谢谢你。现在我希望我能更好地理解match()find()之间的区别,并修改我的代码如下:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexDemo {
  public static void main(String[] args) {
    RegexDemo demo = new RegexDemo();
    System.out.printf("%b%n", demo.zeroWidthAssertionEarly());
  }

  public boolean zeroWidthAssertionEarly()  
  {  
    //匹配以ing结尾的单词
    String reg="\\w*(?=ing)";
    String word = "I’m singing while you’re dancing";//
    boolean tem=false;  

    Pattern pattern = Pattern.compile(reg);  
    Matcher matcher = pattern.matcher(word);  

    while(matcher.find()){
      System.out.printf("start = %d%n", matcher.start());
      System.out.printf("end = %d%n", matcher.end());
    }        
    return tem;  
  } 
}

它的输出使我困惑:

start = 4
end = 8
start = 8
end = 8
start = 25
end = 29
start = 29
end = 29
false

所以我的新问题是:为什么输出不是如下?

start = 4
end = 8
start = 25
end = 29
false

1 个答案:

答案 0 :(得分:0)

您更新的问题的答案是:使用

String reg="(?U)\\w+(?=ing\\b)";

请参阅Java demo

模式说明:

  • \w+ - 匹配一个或多个
  • 的字母数字或inderscore字符
  • (?=ing\b) - 后跟ing +尾随字边界。

(?U)是确保单词边界与Unicode字符串一致正常所必需的。

您的模式不会检查ing是否位于单词的末尾,并且它允许在单词的开头匹配ing,这不是您所追求的(我猜,匹配-ing形式)。