「12.3」、「1983」、「5/8」などの数字を含む単純なテキスト行があります。数字が表示されるたびに、数字の「8」などの固定文字に置き換える必要があります。
私はJavaで正規表現をいじっています。次のようなものがあります。
String line = str.replaceAll("[0-9]+/*.*[0-9]*", "8");
しかし、役に立たない。
正しいパターンはどうあるべきか考えていますか?
次の式を試してください(?>-?\d+(?:[\./]\d+)?)
。Java文字列では、バックスラッシュをエスケープする必要があることに注意してください。"(?>-?\\d+(?:[\\./]\\d+)?)"
式の内訳は次のとおりです。
囲み(?>...)
は、壊滅的なバックトラックを防ぐための原子グループです。単純な文字列または短い文字列の場合は、それがなくても機能します。
-?
負の数の潜在的なマイナス
\d+
任意の数字のシーケンス(少なくとも1つ)
(?:[\./]\d+)?
ドット(ここではエスケープする必要はありません。一貫性を保つためです)またはスラッシュの後に少なくとも1桁の数字が続く、オプションの非キャプチャグループ。
アップデート
.1234
、、1234.
/1
または5/
(数字が左または右に欠落している)のような「数字」を置き換えたくない場合は、次の式を試してください。(?>(?<![\d\./])-?\d+(?:(?:[\./]\d+)|(?![\d\./])))
内訳は次のとおりです。
囲み(?>...)
は、壊滅的なバックトラックを防ぐための原子グループです。単純な文字列または短い文字列の場合は、それがなくても機能します。
(?<![\d\./])
一致は数字、ドット、またはスラッシュの直後に続くことはできません-数字の先頭で一致するには、数字に従わないという制約が必要であることに注意してください。そうでない場合は234
、.1234
-?
負の数の潜在的なマイナス
\\d+
任意の数字のシーケンス(少なくとも1つ)
(?:(?:[\./]\d+)|(?![\d\./]))
一致には、ドットまたはスラッシュの後に少なくとも1桁が続くか、数字、ドット、またはスラッシュが続かないようにする必要があります。これは一致しますが、一致1.0
しません1.
-一致を防ぐために、数字の制約が続かないようにする必要があることに注意してください123
の1234.
整数を1文字だけに置き換える必要がある場合は、次のコードを使用してください。
import java.io.*;
class Moo
{
public static void main(String[] args)
{
String vals[] = { "1.2", "-3.14", "100500" };
for (String s : vals)
System.out.println(s.replaceAll("(-)?\\d+(\\.\\d*)?", "x"));
}
}
ただし、各桁を置き換える必要がある場合は、次のような異なる正規表現を使用する必要があります"\\d"
。
デモをご覧ください。
エスケープするのを忘れました。キャラクター。それ以外は、あなたのパターンは私には似合います。
String line = str.replaceAll("[0-9]+/*\\.*[0-9]*", "8");
それでもうまくいかない場合は、式が正しく機能していない場合を教えてください。