8

文字列の先頭と末尾の句読点をすべて削除したいと思います。これどうやってするの?

基本的に、単語間の句読点を保持したいので、先頭と末尾の句読点をすべて削除する必要があります。

  1. .、、、、、、は文字または数字で囲まれている場合に許可さ@れます_&/-
  2. \'文字または数字が前に付いている場合は許可されます

私は試した

Pattern p = Pattern.compile("(^\\p{Punct})|(\\p{Punct}$)");
Matcher m = p.matcher(term);
boolean a = m.find();
if(a)
    term=term.replaceAll("(^\\p{Punct})", "");

しかし、それはうまくいきませんでした!

4

3 に答える 3

11

Ok。したがって、基本的には、文字列内のパターンを見つけて、パターンが一致した場合に行動する必要があります。

これを単純な方法で行うのは面倒です。ナイーブな解決策には、次のようなものが含まれる可能性があります

while(myString.StartsWith("." || "," || ";" || ...)
  myString = myString.Substring(1);

もう少し複雑なタスクを実行したい場合は、私が述べた方法を実行することさえ不可能かもしれません。

そのため、正規表現を使用しています。パターンを定義できる「言語」です。文字列がそのパターンに一致する場合、コンピュータは言うことができます。正規表現について学ぶには、それをgoogleに入力するだけです。最初のリンクの1つ:http://www.codeproject.com/Articles/9099/The-30-Minute-Regex-Tutorial

あなたの問題に関しては、あなたはこれを試すことができます:

myString.replaceFirst("^[^a-zA-Z]+", "")

正規表現の意味:

  • 最初の^は、このパターンでは、次に来るのは文字列の先頭にある必要があることを意味します。

  • []は文字を定義します。この場合、それらは(2番目の^)文字(a-zA-Z)ではないものです。

  • +記号は、その前のものを繰り返して正規表現と一致させることができることを意味します。

同様の正規表現を使用して、末尾の文字を削除できます。

myString.replaceAll("[^a-zA-Z]+$", "");

$は「文字列の最後に」を意味します

于 2012-09-20T06:02:00.910 に答える
5

正規表現を使用できます。

private static final Pattern PATTERN =
    Pattern.compile("^\\p{Punct}*(.*?)\\p{Punct}*$");

public static String trimPunctuation(String s) {
  Matcher m = PATTERN.matcher(s);
  m.find();
  return m.group(1);
}

境界マッチャー^$入力全体が一致していることを確認します。

ドット.は任意の1文字に一致します。

*は「前のものと0回以上一致する」という意味です。

括弧()は、を呼び出すことによって値が取得されるキャプチャグループを定義しますMatcher.group(1)

?inは、マッチを欲張り(.*?)でないものにしたいことを意味します。そうでない場合、末尾の句読点がグループに含まれます。

于 2020-06-26T02:04:24.677 に答える
1

パターンについては、このチュートリアルを使用してください。アルファベットまたは数字で始まり、アルファベットまたは数字で終わる文字列に一致する正規表現を作成する必要があります。inputString.matches("regex")

于 2012-09-20T05:49:54.977 に答える