Java正则表达式与问号和单词边界完全匹配

时间:2017-05-31 17:39:18

标签: java regex

在java中,我试图确定用户输入的字符串(意思是我不知道输入将是什么)完全包含在字边界的另一个字符串中。因此,the中的there is no match输入不应与String input = "string contain"; Pattern p = Pattern.compile("\\b" + Pattern.quote(input) + "\\b"); //both should and do match System.out.println(p.matcher("does this string contain the input").find()); System.out.println(p.matcher("does this string contain? the input").find()); 匹配。当输入的字符串中有标点符号时,我遇到了问题,但可以使用一些帮助。

没有标点符号,这很好用:

String input = "string contain?";
Pattern p = Pattern.compile("\\b" + Pattern.quote(input) + "\\b");

//should not match - doesn't
System.out.println(p.matcher("does this string contain the input").find());

//expected match - doesn't
System.out.println(p.matcher("does this string contain? the input").find());

//should not match - doesn't
System.out.println(p.matcher("does this string contain?fail the input").find());

但是当输入中有一个问号时,与单词边界的匹配似乎不起作用:

{{1}}

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:2)

?之间没有单词边界,因为没有相邻的单词字符;这就是你的模式不匹配的原因。您可以将其更改为:

Pattern.compile("(^|\\W)" + Pattern.quote(input) + "($|\\W)");

匹配输入或非单词字符的开头 - 模式 - 输入或非单词字符的结尾。或者,更好的是,你使用负面的后观和负面的前瞻:

Pattern p = Pattern.compile("(?<!\\w)" + Pattern.quote(input) + "(?!\\w)");

这意味着,在你的模式之前和之后,一定不能有单词字符。

答案 1 :(得分:1)

您可以使用:

Pattern p = Pattern.compile("(\\s|^)" + Pattern.quote(input) + "(\\s|$)");
//---------------------------^^^^^^^----------------------------^^^^^^^

对于Strings,你会得到:

does this string contain the input       -> false
does this string contain? the input      -> true
does this fail the input string contain? -> true
does this string contain?fail the input  -> false
string contain? the input                -> true

我的想法是,匹配包含input + spaceend with your input的字符串。

答案 2 :(得分:0)

您正在使用字词边界进行匹配:\b

Java RegEx实现认为后续字符为单词字符: \w:= [a-zA-Z_0-9]

任何非单词字符都只是上述组之外的字符 [^\w]:= [^a-zA-Z_0-9]

字边界是从[a-zA-Z_0-9][^a-zA-Z_0-9]的过渡,反之亦然。

对于输入"does this string contain? the input"和文字模式\\b\\Qstring contain?\\E\\b,最后一个单词边界\\b在输入文本中属于从?<white space>的过渡,因此根据上述定义, 转换为 word 不是单词边界