我似乎无法弄清楚正则表达量词。像寻找“......”这样简单的东西对我来说不起作用。
这是我的模式:
Pattern p = Pattern.compile("\\.{3}");
我理解错了吗?表达式“X {n}”表示将X精确地取n次?
但像“......”这样的字符串工作得很好,即使它不是3次。
答案 0 :(得分:2)
我认为由于...
的{{1}}也返回true,因此您正在使用Matcher类中的....
方法。现在我至少可以看到你想要实现的两件事:
find
...
,但前提是它只有3个点,所以如果它之前或之后有一些额外的点,则不希望接受...
。要解决案例1,您只需使用{/ 1}}方法,例如
...
要解决第二种情况,您需要使用negative-look-around机制明确说明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
答案 1 :(得分:1)
这取决于您使用的方法,如果您使用find
方法或lookingAt
,因为\\.{3}
内....
您将获得匹配,因为这三个找到了点。
要准确匹配从字符串的开头到结尾的模式,您需要方法matches
或者你可以使用锚点开始^
和结束$
字符串:
with lookingAt: \\.{3}$
with find: ^\\.{3}$
matches
不需要锚点。
如果您需要使用...
方法在更大的字符串中找到find
,则需要使用lookbehind和lookahead断言以确保之前和之后没有点:
(?<!\\.)\\.{3}(?!\\.) # not preceded by a dot, not followed by a dot