1

入力文字列から数値シーケンスを取得できる正規表現には、数字ではなくバックスラッシュが含まれます。たとえば、次のようになります。

"12\34a56ss7890"

する必要がある -

1234567890
4

7 に答える 7

3

これが文字列にあると仮定すると。次のようなことができます:

string = string.replaceAll("\\D", "");

これにより、文字列の数字以外のすべての文字が置き換えられます。

于 2012-10-05T15:38:50.810 に答える
1

別の回答を追加して申し訳ありませんが、これはコメントに収まらないため必要です。

これは\34のせいだと思います。呼び出すSystem.out.print("12\34a56ss7890");と、次の出力が得られます12a56ss7890。これは、\34 がエスケープされるためです。これは Java の問題です。これを修正するには、最初に InputStream でこのメソッドを呼び出します。

private InputStreamReader replaceBackSlashes() throws Exception {

    FileInputStream fis = new FileInputStream(new File("PATH TO A FILE");
    Scanner in = new Scanner(fis, "UTF-8");
    ByteArrayOutputStream out = new ByteArrayOutputStream();

    while (in.hasNext()) {
        String nextLine = in.nextLine().replace("\", "");
        out.write(nextLine.getBytes());
        out.write("\n".getBytes());
    }

    return new InputStreamReader(new ByteArrayInputStream(out.toByteArray()));
}

ところで: 私の編集で申し訳ありませんが、コードに少し間違いがありました。

このメソッドを呼び出した後、InputStream を文字列に変換し、文字列でこれを呼び出します。

string = string.replaceAll("\\D", "");

これでうまくいくはずです:)

于 2012-10-05T15:57:31.237 に答える
1

正規表現を使用します。

String numvber;
String str =" 12\34a56ss7890";
str= str.replace("\34", "34");
String regex = "[\\d]+";//match only digits.

Matcher matcher = Pattern.compile( regex ).matcher( str);
while (matcher.find( ))
{
num = matcher.group(); 
System.out.print(num);                 
}
于 2013-04-03T17:18:23.187 に答える
1
   String num;
   String str =" 12\34a56ss7890";
   str= str.replace("\34", "34");
   String regex = "[\\d]+";

   Matcher matcher = Pattern.compile( regex ).matcher( str);
    while (matcher.find( ))
    {
    num = matcher.group(); 
    System.out.print(num);                 
    }
    replace \34 by 34 and match the rest using regular expression.
于 2012-10-07T07:04:01.940 に答える
1
str.replaceAll("[^\d]", "");

ブートノート: 私は Java 開発者ではありませんが、正規表現自体は正しいはずです

于 2012-10-05T15:38:24.053 に答える
0

次の例:

String a ="1\2sas";
String b ="1\\2sas";

System.out.println(a.replaceAll("[a-zA-Z\\\\]",""));
System.out.println(b.replaceAll("[a-zA-Z\\\\]",""));

出力を与えます:

1X
12

ここで、X は X ではなく、小さな四角形です。これは、コントロールを表示するテキストが描画方法を認識していない場合に表示される記号、いわゆる印刷不可能な文字です。

これは、文字列の "\2" の部分が明らかに単一のエスケープ記号 "\u0002" ("\n" "\t" と同様) として解釈されようとするためです。これはデバッガーで確認できます (NetBeans を使用して試しました)。 )

replaceAll メソッドの最初の引数は [Pattern.compile](http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#replaceAll(java.lang.String) に渡されるため、java.lang.String))文字列リテラル (b など) とは対照的に、2 回エスケープする必要があります。

したがって、文字列 "12\34a56ss7890" が画面上で次のように表示される場合、次のように出力されます。

System.out.println("12\\34a56ss7890");

これは 2 番目の例で解決されます。

ただし、リテラルが「12\34a56ss7890」として指定されている場合、バックスラッシュの後に数字が続くと \u0000 -\u0009 と解釈されるため、単一の正規表現では処理できないと思います。 think of は非常に醜い解決策です:

str.replaceAll("\u0000","0").replaceAll("\u0001","1") ... .replaceAll("\u0009","9").replaceAll("[^\\d]")

最初の置換 (\u0000-\u0009) は、エレガントに見せるために for ループとして書き直すことができます。

優れた質問の場合は+1:)

編集: 実際には、バックスラッシュの後に複数の数字が続く場合、それらはすべて単一の記号として解釈されます。バックスラッシュの後に最大 3 つの数字があり、4 番目の数字は単一の数字として扱われます。

したがって、私の解決策は一般的に正しくありませんが、拡張することができます。以下のロビンのソリューションははるかに効率的であるため、お勧めします。

于 2012-10-05T16:48:50.927 に答える
0

文字\34は string 内の 8 進数であるため、次の12\34a56ss7890ように使用できます。

str.replaceAll("\034", "34").replaceAll("\\D", "")
于 2012-10-05T15:56:54.980 に答える