java - 单词末尾加号的正则表达式

标签 java regex

我收到了 2 条短信:

第一个: 我最喜欢的编程语言是 c++。

第二个: 我最喜欢的编程语言是 c。

并且想要在这些文本中分别查找 cc++

为了查找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/

相关文章:

java - 如何在java中将视频文件压缩为3gp或mp4?

python - 如何在python中将相似文件名的文件组合在一起?

c++ - 使用正则表达式拆分字符串,忽略大括号内出现的定界符

regex - R中位置序列的长度(以字符串形式给出)

java - 替换所有捕获的组

java - WSDL 发布后发生更改

java - 协助菜鸟进行Java堆应用

java - "if block"中的语句在 "if condition"中的函数返回之前执行

带参数和不带参数的 Java 泛型列表和 ArrayList

ios - Swift,电话号码正则表达式