web-dev-qa-db-ja.com

文字列が特定のパターンで終わるかどうかを確認します

次のような文字列がある場合:

This.is.a.great.place.too.work.

または:

This/is/a/great/place/too/work/

私のプログラムは、文が有効であり、「仕事」があることを私に与える必要があります。

私が持っている場合:

This.is.a.great.place.too.work.hahahha

または:

This/is/a/great/place/too/work/hahahah

それから私のプログラムは文に「仕事」があることを私に与えるべきではありません。

ですから、Java文字列を見て、、またはまたは/を持つセンテンスの最後にあるWordを見つけています。 =その前。どうすればこれを達成できますか?

53
The Learner

これは本当に簡単です。 String オブジェクトには endsWith メソッドがあります。

あなたの質問から、/,、または.のいずれかが区切り文字セットとして必要なようです。

そう:

String str = "This.is.a.great.place.to.work.";

if (str.endsWith(".work.") || str.endsWith("/work/") || str.endsWith(",work,"))
     // ... 

matches メソッドとかなり単純な正規表現を使用してこれを行うこともできます。

if (str.matches(".*([.,/])work\\1$"))

ピリオド、スラッシュ、またはコンマのいずれかを指定する文字クラス[.,/]、および代替が見つかった場合に一致する後方参照\1を使用します。

80
pb2q

文字列がworkで終わり、その後に次のような1文字が続くかどうかをテストできます。

theString.matches(".*work.$");

末尾の文字がオプションの場合、これを使用できます。

theString.matches(".*work.?$");

最後の文字がピリオド.またはスラッシュ/であることを確認するには、これを使用できます。

theString.matches(".*work[./]$");

workに続いてオプションピリオドまたはスラッシュをテストするには、これを使用できます:

theString.matches(".*work[./]?$");

workをテストするには囲まれた期間ごとまたはスラッシュ、これを行うことができます:

theString.matches(".*[./]work[./]$");

tokens before and afterwork互いに一致する必要がありますの場合、これを行うことができます:

theString.matches(".*([./])work\\1$");

正確な要件は正確に定義されていませんが、次のようなものになると思います。

theString.matches(".*work[,./]?$");

言い換えると:

  • 0個以上の文字
  • 続けてwork
  • ゼロまたは1つが続く,.または/
  • その後に入力の終わりが続きます

さまざまな正規表現アイテムの説明:

.               --  any character
*               --  zero or more of the preceeding expression
$               --  the end of the line/input
?               --  zero or one of the preceeding expression
[./,]           --  either a period or a slash or a comma
[abc]           --  matches a, b, or c
[abc]*          --  zero or more of (a, b, or c)
[abc]?          --  zero or one of (a, b, or c)

enclosing a pattern in parentheses is called "grouping"

([abc])blah\\1  --  a, b, or c followed by blah followed by "the first group"

試してみるテストハーネスは次のとおりです。

class TestStuff {

    public static void main (String[] args) {

        String[] testStrings = { 
                "work.",
                "work-",
                "workp",
                "/foo/work.",
                "/bar/work",
                "baz/work.",
                "baz.funk.work.",
                "funk.work",
                "jazz/junk/foo/work.",
                "funk/punk/work/",
                "/funk/foo/bar/work",
                "/funk/foo/bar/work/",
                ".funk.foo.bar.work.",
                ".funk.foo.bar.work",
                "goo/balls/work/",
                "goo/balls/work/funk"
        };

        for (String t : testStrings) {
            print("Word: " + t + "  --->  " + matchesIt(t));
        }
    }

    public static boolean matchesIt(String s) {
        return s.matches(".*([./,])work\\1?$");
    }

    public static void print(Object o) {
        String s = (o == null) ? "null" : o.toString();
        System.out.println(o);
    }

}
41
jahroy

サブストリングメソッドを使用できます。

   String aString = "This.is.a.great.place.too.work.";
   String aSubstring = "work";
   String endString = aString.substring(aString.length() - 
        (aSubstring.length() + 1),aString.length() - 1);
   if ( endString.equals(aSubstring) )
       System.out.println("Equal " + aString + " " + aSubstring);
   else
       System.out.println("NOT equal " + aString + " " + aSubstring);
2
Scooter

もちろん、 StringTokenizer クラスを使用して、「。」で文字列を分割できます。または「/」、最後の単語が「作業」であるかどうかを確認します。

2
goldenpiggy

endsWith メソッドを使用して、この問題を解決できます。

まず、endswithメソッドを使用した簡単な例を試みます

public class Test {

  public static void main(String args[]) {
     String Str = new String("This is really not immutable");

     retVal = Str.endsWith( "immutable" );
     System.out.println("Returned Value = " + retVal );
  }
}

Strの最後の値は「不変」です。その後、コンソールでtrueを確認できます。あなたの質問によると、

public class Test {

   public static void main(String args[]) {
     String Str = new String("This/is/a/great/place/too/work/hahahah");
     boolean retVal;

     retVal = Str.endsWith( "work/hahahah" );
     System.out.println("Returned Value = " + retVal );

    if(retVal == true){
      System.out.println("Its work");
    }
 }

}

0
Dev4World

「。」のインデックスを取得するために、ここで言及したさまざまなことをすべて試しました。 。[0-9] [0-9] *で終わるファイル名の文字。 srcfile.1、srcfile.12など。何も機能しませんでした。最後に、以下が機能しました。int dotIndex = inputfilename.lastIndexOf( "。");

変だ!これは、Java -version openjdk version "1.8.0_131" OpenJDK Runtime Environment(build 1.8.0_131-8u131-b11-0ubuntu1.16.10.2-b11)OpenJDK 64-Bit Server VM(ビルド25.131-b11、混合モード)

また、正規表現の公式Java docページ(上記の回答のいずれかに引用符があります)は、「。」の検索方法を指定していないようです。キャラクター。 「。」、「\。」、および「[。]」が機能しなかったため、これら以外のオプションが指定されていないためです。

0
Intros Pector