在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}}
任何帮助都将不胜感激。
答案 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 + space
或end 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>
的过渡,因此根据上述定义,非