2017-10-06 73 views
1

我得到了2個文本的末尾:正則表達式加號的字

第一招: My favorite programming language is c++.

第二個: My favorite programming language is c.

,並希望尋求cc++在這些文本分開。

對於尋找c我可以寫:\bc\b然後:第一個文本是壞的!第二個是好的。我也試過:\bc^\+\b但不起作用。 對於fiding c++我嘗試了例如:\bc\+\+\b但後來第一個和第二個不起作用。請幫助。

編輯:

如果什麼文本將I programme in c++ a lot!

編輯:

這裏的單元測試,我需要完成:通過改變只爲compile()方法的參數

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++")); 
    } 

} 

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());  
    } 
} 
+0

難道你不能找出句子中的最後一個單詞嗎? – wp78de

+0

使用'(?<!\ w)c \ + \ +(?!\ w)','String p =「(?<!\\ w)c \\ + {2} 「;' –

+0

它不適用於尋找'c' –

回答

1

更換.compile(x)

.compile("(?<![\\w\\p{S}])" + Pattern.quote(x) + "(?![\\w\\p{S}])") 

在此線,(?<![\w\p{S}])是負回顧後,將確保沒有的詞或CHAR符號立即到當前位置的左側,和(?![\w\p{S}])負向前視將確保當前位置右側沒有字或符號字符(即字和符號字符是允許的「字」字符現在)。

請參閱sample regex demo for a c++ keyword at regex101.com

由於搜索詞作爲文字字符序列傳遞到Pattern,因此它們是must be escaped,這就是Pattern.quote(x)正在代碼中執行的操作。

2

你可以,你只是看點之前句子中的最後一個單詞。

[\w+]+(?=\.$) 

https://regex101.com/r/aPYDTE/1

使用圖案的問題是,加號不是一個單詞,因此單詞邊界\b不匹配。如果你想使用點錨,你會得到一個匹配\b(c\+\+)\.

如果你只是想匹配的C/C++等語言嘗試\W(c\+\+|css|c|java)\W
我添加了一個非單詞\W爲界。添加四處看看允許您使用完整匹配而不是使用捕獲組$ 1。

(?<=\W)(c\+\+|css|c|java)(?=[^\w\+]) 

https://regex101.com/r/qWnOsB/4

+0

追求的語言在最後並不含糊。如果文本將是'我用C++編程!'? –

+0

你的第二個解決方案也可以匹配c + – raph

+0

我編輯添加了我想完成的單元測試。不幸的是你的解決方案無法工作:( –