Java匹配字符串中的整个单词

时间:2016-07-06 16:47:11

标签: java regex string match

我有一个library(dplyr) ans <- finaldf %>% group_by(SeqDateTime = cut(SeqDateTime, breaks = "15 min")) %>% summarize(broomsTot = sum(as.numeric(broomsTot), na.rm = TRUE)) head(ans) Source: local data frame [6 x 2] SeqDateTime broomsTot (fctr) (dbl) 1 2015-01-01 02:00:00 0 2 2015-01-01 02:15:00 0 3 2015-01-01 02:30:00 0 4 2015-01-01 02:45:00 0 5 2015-01-01 03:00:00 0 6 2015-01-01 03:15:00 0 我会迭代以找到给定String的正确索引。基本上,给定一个String,程序应该搜索列表并找到整个单词匹配的索引。例如:

ArrayList<String>

因此,如果我给出字符串ArrayList<String> foo = new ArrayList<String>(); foo.add("AAAB_11232016.txt"); foo.add("BBB_12252016.txt"); foo.add("AAA_09212017.txt"); ,我应该回到索引AAA(最后一个)。所以我不能使用2方法,因为这会给我回索引contains()

我尝试使用此代码:

0

不幸的是,这段代码永远不会到达循环内的String str = "AAA"; String pattern = "\\b" + str + "\\b"; Pattern p = Pattern.compile(pattern); for(int i = 0; i < foo.size(); i++) { // Check each entry of list to find the correct value Matcher match = p.matcher(foo.get(i)); if(match.find() == true) { return i; } } 语句。我不确定我做错了什么。

注意:如果我搜索if,全名AAA_0921或字符串中任何独特的部分,这也应该有效。

1 个答案:

答案 0 :(得分:6)

由于单词char和下划线之间的单词边界不匹配,您需要

String pattern = "(?<=_|\\b)" + str + "(?=_|\\b)";

此处,(?<=_|\b)正向后视需要在str之前显示单词边界或下划线,而(?=_|\b)正向前瞻需要下划线或单词边界才会出现在str

this regex demo

如果你的单词里面有特殊的字符,你可能想要使用更直接的单词边界:

"(?<![^\\W_])" + Pattern.quote(str) + "(?![^\\W_])"

这里,如果除了下划线之外有一个单词字符,则负向后看(?<![^\\W_])会使匹配失败([^...]是一个否定字符类,它匹配除了字符,范围等之外的任何字符。因此,在此类中,它匹配除非单词char \W_之外的所有字符,如果存在单词char,则(?![^\W_])否定前瞻将使匹配失败str之后的下划线。

请注意,第二个示例包含引用的搜索字符串,因此即使AA.A_str.txt也可以与AA.A很好地匹配。

请参阅another regex demo