我正在研究零宽度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
答案 0 :(得分:0)
您更新的问题的答案是:使用
String reg="(?U)\\w+(?=ing\\b)";
请参阅Java demo
模式说明:
\w+
- 匹配一个或多个 (?=ing\b)
- 后跟ing
+尾随字边界。 (?U)
是确保单词边界与Unicode字符串一致正常所必需的。
您的模式不会检查ing
是否位于单词的末尾,并且它允许在单词的开头匹配ing
,这不是您所追求的(我猜,匹配-ing
形式)。