2013-02-19 5 views
5

Jestem nowy w Javie. Chcę wyszukać ciąg w pliku tekstowym. Załóżmy, że plik zawiera:Jak znaleźć słowo za pomocą dot przy użyciu wyrażeń regularnych w Javie?

Witam, uczę się języka Java.

Używam poniższego wzoru do wyszukiwania każdego wyrazu.

Pattern p = Pattern.compile("\\b"+search string+"\\b", Pattern.CASE_INSENSITIVE); 

Działa dobrze, ale nie znajduje "java". Jak znaleźć oba wzory. tj. z symbolami granicznymi iz "." na końcu ciągu. Czy ktoś ma jakieś pomysły na rozwiązanie tego problemu?

+0

Czyli mówisz, że jeśli twój ciąg wyszukiwania to "Java", chcesz, aby znalazł "Java."? Inne wyjaśnienia pomogłyby nam rozwiązać twój problem. – Default

+0

Przekonwertowałem swój komentarz do odpowiedzi. –

+0

Jeśli szukasz literału, użyj po prostu ['String # indexOf (String)'] (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html# indexOf (java.lang.String)), wyrażeń regularnych tylko dodać komplikacji. – maerics

Odpowiedz

3

Należy przeanalizować swoją wyszukiwarki ciąg w celu zmiany kropkę . w regex kropką: \\.. Zauważ, że a single dot is a metacharacter in Regular Expressions i oznacza dowolny znak. Na przykład, można wymienić wszystkie kropki w swojej String dla \\.

Jeśli nie chcesz, aby zrobić wszystko, pracę, a potem po prostu wysłać java\\. jako ciągu wyszukiwania

Więcej informacji:

Kod:

public static void main(String[] args) { 
    String fileContent = "Hi i am learning java."; 
    String searchString = "java"; 
    Pattern p = Pattern.compile(searchString); 
    Matcher m = p.matcher(fileContent); 
    while(m.find()) { 
     System.out.println(m.start() + " " + m.group()); 
    } 
} 

Byłoby wydrukować: 17 java

public static void main(String[] args) { 
    String fileContent = "Hi i am learning java."; 
    String searchString = "java\\."; 
    Pattern p = Pattern.compile(searchString); 
    Matcher m = p.matcher(fileContent); 
    while(m.find()) { 
     System.out.println(m.start() + " " + m.group()); 
    } 
} 

Byłoby wydrukować: 17 java. (zwróć uwagę na kropkę na końcu)

EDIT: Jak bardzo prosty rozwiązanie, ponieważ jedynym problemem, jaki masz, jest kropka, możesz zastąpić wszystkie kropki w ciągu znaków wartością \\.

public static void main(String[] args) { 
    String fileContent = "Hi i am learning java."; 
    String searchString = "java."; 
    //this will do the trick even if the "searchString" doesn't contain a dot inside 
    searchString = searchString.replaceAll("\\.", "\\."); 
    Pattern p = Pattern.compile(searchString); 
    Matcher m = p.matcher(fileContent); 
    while(m.find()) { 
     System.out.println(m.start() + " " + m.group()); 
    } 
} 
+0

O Boże, to nie jest wyszukiwanie "java". sam. Słowa mogą się różnić, a plik wejściowy również się różnić. Może to być dowolne słowo kończące się na okresie –

+0

@VijayAnand to tylko przykład, nie ma na celu powiedzieć, w jaki sposób należy wdrożyć rozwiązanie. –

+0

@VijayAnand odpowiedź zaktualizowana. –

0
"\\b" + searchstring + "(?:\\.|\\b)" 

Jeśli chcesz zastrzec, że kropka musi następować ma charakteru tekstu lub końcu łańcucha, można dodać pozytywny look-ahead

"\\b" + searchstring + "(?:\\.(?=\\W|$)|\\b)" 
0
Pattern p = Pattern.compile(".*\\W*" + searchWord + "\\W*.*", Pattern.CASE_INSENSITIVE); 

Aby być absolutnie pewnym, powyższe zdanie mówi "znajdź mi trochę tekstu, który zaczyna się od 0 lub więcej znaków, po którym następuje 0 lub więcej znaków nie-słów w szczególności (\ W * - granica słowa), po których następuje słowo wyszukiwania, następnie następna granica słowa, po której następuje wszystko inne ".

Spowoduje to uwzględnienie sytuacji, w których wyszukiwane słowo znajduje się na początku pliku, na samym końcu lub między znakami interpunkcyjnymi, np .: "cześć, uczę się, java.".

Mam nadzieję, że to pomoże ...

Powiązane problemy