web-dev-qa-db-ja.com

Javaを使用して文にWordが存在するかどうかを確認する方法は?

Wordが文に存在する場合にtrueを返す関数のプログラミングと作業は初めてです。 indexOf()メソッドを試しましたが、このアプローチで特定の問題に遭遇しました。

私の文が_I am a, Java Programmer._であるとします

indexOf()メソッドでWord ramを探すと、trueramに存在するため、Programmerが返されます。 falseはWordとしてではなくパターンとして存在するため、正しい出力はramになります。

この問題を回避するにはどうすればよいですか?私が現在使用しているコードは次のとおりです。

_boolean isPresent(String Word, String sentence)
{
    if(sentence.indexOf(Word) >= 0)
        return true;
    else
        return false;
}
_

注: Word ramは、現在のアプローチの問題の1つを示すための例にすぎません。常にramで作業する必要があるわけではありません.Wordはaのようなもので、上記の文でコンマが続きます。

PDATE:コメントと解決策を提供してくれたすべての人に感謝します。私は受け入れられた答えとして1つを選択しました(許可されればもっと選択します:-))が、多くは役に立ちました。

33
user2966197

正規表現を試してください

boolean contains = s.matches(".*\\bram\\b.*");

\ bは単語境界を意味します

39

Wordを検索するため、3つのケースがあります。

  1. 文の先頭の単語は、先頭にスペースがなく、末尾にスペースがあることを意味します。
  2. 両端の文スペースの間の単語。
  3. 最後の単語は最後のスペースのみ。

3つのケースすべてをカバーするための1つの可能な解決策は次のとおりです。

String str = "I am a Java programmer";
String[] splited = str.split("\\b+"); //split on Word boundries
Arrays.asList(splited).contains("ram"); //search array for Word

ここにデモがあります

21
Zaheer Ahmed

質問:

どのように単語を定義しますか?

可能な答え:

他の文字で区切られた文字の束。この2番目の文字セットは、選択内容によって定義されます。これらを. ,?;に選択するとします。したがって、これらの文字( delimiters と呼ばれる)で入力文字列を分割すると、words。入力にWordが含まれているかどうかを確認するには、これらの文字列をループして、クエリに一致するかどうかを確認します。

コード:

boolean isPresent(String query, String s) {    
    String [] deli = s.split("[.\\s,?;]+");

    for(int i=0;i<deli.length;i++)
        if(query.equals(deli[i]))
            return true;

    return false;    
}

tl; dr:

Wordをアルファベット、数字、アンダースコアで構成されるものとして定義する場合は、\W+という正規表現が用意されています。

String [] deli = s.split("\\W+");

Java Regex。について詳しく知りたい場合は、 この記事 を読むことを検討してください。

10

句読点があっても文中の単語と一致させたい場合は、次のような正規表現が必要です。

  static boolean matchesWord(String toMatch, String matchIn) {
     return Pattern.matches(".*([^A-Za-z]|^)"+toMatch+"([^A-Za-z]|$).*", matchIn);
  }

(\ Wを使用できますが、アンダースコアを句読点としてカウントしません。)

スペースを最初と最後に連結するだけで、たとえば、文字列「I am a Java Programmer」のワード「programmer」は、末尾にスペースがないため一致しません。また、句読点の前後の単語には直接一致しません。

2
broomweed

String.matches()メソッドを見てください。正規表現を適切に作成すれば、望みどおりに実行できるはずです。正規表現を始めるのに適した場所は、Javaチュートリアル: http://docs.Oracle.com/javase/tutorial/essential/regex/

2
awksp

これは、各Wordがスペースで区切られていると仮定して機能します。わかりやすくするために、メイン関数を追加しました。 Wordが存在しない場合、find_strは-1を返します。それ以外の場合、他の単語に対するWordの位置を返します。ここでは、2が返されます。これは、2番目のWordが「am」であることを意味します。

import Java.util.*;
public class HelloWorld{

    public static void main(String []args){
        String str="I am a Java Programmer";
        String str1="am";
        int x=find_str(str,str1);
        System.out.println(x);

    }

    public static int find_str(String main,String search) {

        int i; 
        int found=-1;

        String[] s=main.split(" ");
        for(i=0;i<s.length;i++)
        {
            if(search.equals(s[i]))
            found=i+1;
        }
        return found;
    }
}
1
Tina Maria

この解決策を試してください

    int index = sent.indexOf(find);
    if (index != -1) {
        if (index == 0) {
            System.out.println("true");
        }
        else if (index + find.length() == sent.length())
        {
            System.out.println("true");
        }
        else if (sent.charAt(index - 1) == ' ' && sent.charAt(find.length() + index) == ' ') {
            System.out.println("true");
        } else {
            System.out.println("false");
        }

    } else {
        System.out.println("false");
    }

元の質問よりも何かしたい場合は、代わりにスペースをチェックするために、スペースが0-9とa-Zの間にないことを確認する必要があります。これはコンマピリオドなどの文字をカバーする必要があります.

1
Scary Wombat
String s="I am a Java programmer";
    String s1="Java";
    String []p=s.split("\\s*(=>|,|\\s)\\s*");
        for(int i=0;i<p.length;i++)
        {
            if(s1.equals(p[i]))
            {
                System.out.println(p[i]);
            }

        }
1
Boopathi

より簡単なアプローチは次のとおりです。Wordが次のようなものであると考える場合

「私のPCにはramメモリがあります」(スペース間)

このように、検索するWordの前後にindexOf関数スペースに連結できます。

if(sentence.indexOf( "" + Word + "")> = 0){

1
jhonis.souza

これはかなり厄介な回避策ですが、正しい結果を達成するはずです。文字列内で探している部分文字列を見つけ、部分文字列の前後の文字を見つけます。 ASCII値を使用してこれらを確認してください(int)substring.charAt(x);それらが文字であるかどうかを確認します。両方とも文字ではなく、文字列の境界外にある場合、Wordを見つけたことがわかります。それ以外の場合は、単にWordの一部であることを知っています。

ロジックは非常に長くなります。そのため、私はあなたのためにコーディングしていませんが、これを試して、説明が必要かどうかを教えてください。

0
joepeacock001

ほら文を配列として分割してから、リストに入れることができます。その後、containsメソッドを使用して、Wordが存在するかどうかを確認できます。このコードをお試しください。

import Java.util.ArrayList;
import Java.util.Arrays;


 public class karthitest {
  public static void main(String[] args) {
    String sentence = "I am Karthick";
    String Word = "I";

    if(isWordExist(sentence, Word)){
    System.out.println("Word is exist");
    }
}

public static boolean isWordExist(String sentence, String Word){
    boolean ans = Boolean.FALSE;        
    ArrayList<String> wordList = null;

    try {

        if(sentence != null && Word != null){
            wordList = new ArrayList<String>(Arrays.asList(sentence.split("[^a-zA-z]+")));              
            if(wordList.contains(Word)){
                ans = Boolean.TRUE;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
        // TODO: handle exception
    }
    return ans;
}

}
0