我坚持(简单,我认为) String
验证。我使用以下方法从EditText
获取文本,其中包含420个字符,必须包含特定字(无论其位置):
if(edittext.getText().toString().toLowerCase().contains(stringToHave)) { }
// stringToHave = the specific String
但是,我想改善这种状况。例如,你有这个:
String a = "This not a MetaStackOverflow question";
String b = "stackoverflow";
您想知道a
是否包含b
,无论区分大小写,请执行以下操作:
if(a.toLowerCase().contains(b)) { }
此条件 true ,因为确实a
包含StackOverflow
。但是,a
并不完全包含 b
,前缀为Meta
。这不是完全相同的单词..我试图在SO和其他Java网站上找到一种没有结果的方法。
如何才能改进contains()
方法,只查找没有前缀或后缀的完全 String
?我应该使用另一种方法(作为containsOnly()
,我已经尝试过了,但似乎未定义String,它检查它是否包含数字/字母/等.chars)?
编辑:
添加一个"两个空格"验证是非常有吸引力和巧妙的。但是,如果特定文字位于句子的末尾,并且我们添加了.
,这将无效,不是吗?
a = "This is great. This is on StackOverflow." // false because we have "."
答案 0 :(得分:3)
在模式之前和之后使用空格:
if(a.toLowerCase().contains(" " + b + " ")) { }
答案 1 :(得分:3)
您可以在此处使用正则表达式。 Matcher
类有一个find()
方法,用于搜索字符串中的模式。这将有效:
Matcher matcher = Pattern.compile("(?i)\\b" + Pattern.quote(b) + "\\b").matcher(a);
if (matcher.find()) {
// contains
}
(?i)
是不区分大小写的嵌入式标志。 Pattern.quote()
用于在搜索字符串中转义正则表达式元字符。
答案 2 :(得分:2)
您可以对Pattern
\\b
使用不区分大小写的word boundaries来执行此操作:
String a = "This not a MetaStackOverflow question";
String b = "stackoverflow";
Pattern p = Pattern.compile("\\b" + b + "\\b", Pattern.CASE_INSENSITIVE);
if (p.matcher(a).find()) { }