-2

このリンクで提供されているすべての回答に従い(最初にその質問を投稿しました)、正規表現をそのように変更しました。

たとえば、私の正規表現は今、

  String regex = "(?i)[a-zA-Z0-9_.|-]*" + searchString + "(?i)[a-zA-Z0-9_.|-]*";

「test」を検索文字列として使用して検索を行うと、「testEcho」と「testEcho-1」を検索出力として返す必要があります。

しかし、「テスト」文字列を検索すると、結果として testEcho と testEcho-1 を返すことができませんでした。

私のJavaコードは;

Pattern pattern=Pattern.compile(regex);
Matcher matcher = pattern.matcher(Name)

if (matcher.matches()) {
return XXX;
}

何か助けはありますか?

編集:

Pattern pattern=Pattern.compile(regex);
 Matcher matcher1 = pattern.matcher("testEcho")

    matcher1.matches --------->returns true

Matcher matcher2 = pattern.matcher("testEcho-1")

 matcher2.matches --------->returns false
4

2 に答える 2

3

入力データがどのように見えるかはわかりませんが、おそらく

  • findの代わりに使用する必要がありますmatches
  • -文字クラスでエスケープするか\\-、 start[-...]または endに配置する必要があります[...-]
  • a-zA-Z0-9_と交換でき\\wます。
  • searchString使用から正規表現のメタ文字をエスケープしますPattern.quote()

あなたの正規表現は次のようになります

String regex = "(?i)[\\w.|-]*" + Pattern.quote(searchString) + "[\\w.|-]*";

この方法を試してください

public static List<String> giveMe(String searchString, String input) {
    List<String> results = new ArrayList<>();
    String regex = "(?i)[\\w.|-]*" + Pattern.quote(searchString) + "[\\w.|-]*";

    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(input);

    while (matcher.find()) {
        results.add(matcher.group());
    }

    return results;
}

デモ

System.out.println(giveMe("test","This is some string with testEcho " +
        "and even testEcho-1 that I want to parse."));

出力:

[testEcho, testEcho-1]

[編集]
あなたの例から判断すると、文字列全体が指定された正規表現と一致するかどうかを確認します。そんな時はこの方法を試してみてはいかがでしょうか

public static boolean canFind(String searchString, String input) {
    return input.matches("(?i)[\\w.|-]*" + Pattern.quote(searchString)
            + "[\\w.|-]*");
}

デモ

System.out.println(canFind("test", "testEcho" ));//true
System.out.println(canFind("test", "TestEcho-1"));//true
System.out.println(canFind("test", "WestEcho-1"));//false
于 2013-09-18T19:04:00.460 に答える