我似乎无法弄清楚正则表达式量词。像寻找“...”这样简单的东西对我不起作用。
这是我的模式:
Pattern p = Pattern.compile("\\.{3}");
我理解错了吗?表达式“X{n}”的意思是,取 X 正好 n 次?
但是像 "...." 这样的字符串工作得很好,即使它不是 3 次。
我似乎无法弄清楚正则表达式量词。像寻找“...”这样简单的东西对我不起作用。
这是我的模式:
Pattern p = Pattern.compile("\\.{3}");
我理解错了吗?表达式“X{n}”的意思是,取 X 正好 n 次?
但是像 "...." 这样的字符串工作得很好,即使它不是 3 次。
我假设由于...
返回也为真,....
那么您正在使用find
Matcher 类中的方法。现在我至少可以看到您想要实现的两件事:
...
...
但只有它正好是 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