1

startStr.replaceAll(searchStr, replaceStr) を実行したいのですが、2 つの要件があります。

  1. searchStr は単語全体である必要があります。つまり、スペース、文字列の先頭または文字列の末尾の文字が前後にある必要があります。
    • 例えば
      • startStr = "ON確認、帽子をかぶって"
      • searchStr = "オン"
      • replaceStr = ""
      • 予想=「確認、帽子をかぶって」
  2. searchStr には正規表現パターンが含まれる場合があります
    • 例えば
      • startStr = "この * ものを削除"
      • searchStr = "*"
      • replaceStr = ""
      • expected = 「これを削除してください」

要件 1 については、これが機能することがわかりました。

startStr.replaceAll("\\b"+searchStr+"\\b",replaceStr)

要件 2 については、これが機能することがわかりました。

startStr.replaceAll(Pattern.quote(searchStr), replaceStr)

しかし、私はそれらを一緒に動作させることができません:

startStr.replaceAll("\\b"+Pattern.quote(searchStr)+"\\b", replaceStr)

これは失敗している簡単なテストケースです

startStr = "remove this * thing but not this*"

searchStr = "*"

replaceStr = ""

expected = "remove this thing but not this*"

actual = "remove this * thing but not this*"

私は何が欠けていますか?

前もって感謝します

4

4 に答える 4

1

First off, the \b, or word boundary, is not going to work for you with the asterisks. The reason is that \b only detects boundaries of word characters. A regex parser won't acknowledge * as a word character, so a wildcard-endowed word that begins or ends with a regex won't be surrounded by valid word boundaries.

Reference pages: http://www.regular-expressions.info/wordboundaries.html http://docs.oracle.com/javase/tutorial/essential/regex/bounds.html

An option you might like is to supply wildcard permutations in a regex:

(?<=\s|^)(ON|\*N|O\*|\*)(?=\s|$)

Here's a Java example:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

class RegExTest
{
  public static void main(String[] args){
    String sourcestring = "ON cONfirmation, put * your hat";
    sourcestring = sourcestring.replaceAll("(?<=\\s|^)(ON|\\*N|O\\*|\\*)(?=\\s|$)","").replaceAll("  "," ").trim();
    System.out.println("sourcestring=["+sourcestring+"]");
  }
}

You can write a little function to generate the wildcard permutations automatically. I admit I cheated a little with the spaces, but I don't think that was a requirement anyway.

Play with it online here: http://ideone.com/7uGfIS

于 2013-10-23T03:46:43.290 に答える
0

(^| )\*( |$)使用する代わりに使用できます\\b

これを試してstartStr.replaceAll("(^| )youSearchString( |$)", replaceStr);

于 2013-10-23T06:34:39.990 に答える
0

これを試して、

除去用"ON"

        StringBuilder stringBuilder = new StringBuilder();
        String[] splittedValue = startStr.split(" ");
        for (String value : splittedValue)
        {
            if (!value.equalsIgnoreCase("ON"))
            {
                stringBuilder.append(value);
                stringBuilder.append(" ");
            }
        }
        System.out.println(stringBuilder.toString().trim());

除去用"*"

    String startStr1 = "remove this * thing";
    System.out.println(startStr1.replaceAll("\\*[\\s]", ""));
于 2013-10-23T01:24:42.733 に答える