我似乎不能弄清楚正则表达式量词。像查找"…"这样简单的方法对我不起作用。
这是我的模式:
Pattern p = Pattern.compile("\.{3}");
我理解错了吗?表达式"X{n}"的意思是,取X正好n次?
但是像"...."这样的字符串工作得很好,即使它不是3倍。
我假设由于...
对....
也返回true,那么您正在使用Matcher类中的find
方法。现在我可以看到至少有两件事是您想要实现的:
- 你想检查整个字符串是否只有
...
- 你想检查字符串是否包含
...
,但只有当它恰好是3个点,所以你不想接受...
,如果它之前或之后有一些额外的点。
要解决第一种情况,您只需使用matches
方法,如
Pattern p = Pattern.compile("\.{3}");
Matcher m = p.matcher("...");
System.out.println(m.matches());//returns true
m = p.matcher("....");
System.out.println(m.matches());//returns false
要解决第二种情况,你需要使用负环顾机制明确地说,在...
之前或之后不应该有任何点,所以你的正则表达式可以看起来像
Pattern p = Pattern.compile("(?<!\.)\.{3}(?!\.)");
,现在你可以像之前那样使用find
方法。
Matcher m = p.matcher("some... words. with dots.. after..... them...");
while(m.find())
System.out.println(m.group()+" found at position "+m.start());
将打印
... found at position 4
... found at position 42
这取决于您使用的方法,如果您使用find
方法或lookingAt
,因为在....
中有\.{3}
,您将获得匹配,因为找到了三个点。
要从字符串的开头到结尾精确匹配一个模式,需要使用方法matches
或者您可以使用锚来开始^
和结束$
的字符串:
with lookingAt: \.{3}$
with find: ^\.{3}$
matches
不需要锚。
如果您需要使用find
方法在更大的字符串中精确地找到...
,则需要使用向后看和向前看断言来确保前后没有点:
(?<!\.)\.{3}(?!\.) # not preceded by a dot, not followed by a dot