我收到了 2 条短信:
第一个:
我最喜欢的编程语言是 c++。
第二个:
我最喜欢的编程语言是 c。
并且想要在这些文本中分别查找 c
和 c++
。
为了查找c
,我可以写:\bc\b
然后:第一个文本不好!第二个很好。我也尝试过: \bc^\+\b
但不起作用。
为了查找 c++
我尝试了例如: \bc\+\+\b
但第一个和第二个不起作用。请帮忙。
编辑:
如果文本是 Iprogram in c++ a lot!
会怎样?
编辑:
这是我需要完成的单元测试:
package adhoc;
import java.util.HashSet;
import java.util.Set;
import org.junit.Test;
import junit.framework.TestCase;
public class FinderProgrammingTechnologyInTextTest extends TestCase{
@Test
public void testFind() {
// Given:
Set<String> setOfProgrammingLanguagesToSeek = new HashSet<>();
setOfProgrammingLanguagesToSeek.add("java");
setOfProgrammingLanguagesToSeek.add("perl");
setOfProgrammingLanguagesToSeek.add("c");
setOfProgrammingLanguagesToSeek.add("c++");
// When:
FinderProgrammingTechnologyInText finder = new FinderProgrammingTechnologyInText(
setOfProgrammingLanguagesToSeek);
Set<String> result = finder.find("java , perl! c++ and other staff");
// Then:
assertTrue(result.contains("java"));
assertTrue(result.contains("perl"));
assertFalse(result.contains("c"));
assertTrue(result.contains("c++"));
}
}
仅更改 compile()
方法的参数:
package adhoc;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class FinderProgrammingTechnologyInText {
Set<String> setOfTechnologiesToSearch;
public FinderProgrammingTechnologyInText(Set<String> x) {
this.setOfTechnologiesToSearch = x;
}
public Set<String> find(String text) {
Set<String> result = new HashSet<>();
return setOfTechnologiesToSearch.stream()
.filter(x -> Pattern
.compile(x) // change only this line
.matcher(text).find()
)
.collect(Collectors.toSet());
}
}
最佳答案
替换.compile(x)
符合
.compile("(?<![\\w\\p{S}])" + Pattern.quote(x) + "(?![\\w\\p{S}])")
在这里,(?<![\w\p{S}])
是一个负向后查找,将确保当前位置左侧没有单词或符号字符,并且 (?![\w\p{S}])
负向前视将确保当前位置右侧没有紧邻的单词或符号字符(也就是说,单词和符号字符现在是您允许的“单词”字符)。
查看sample regex demo for a c++
keyword at regex101.com .
由于搜索词作为文字字符序列传递到 Pattern
,他们must be escaped ,这就是 Pattern.quote(x)
是在代码中执行的。
关于java - 单词末尾加号的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46612522/