1

什么正则表达式可以从输入字符串中得到一个数字序列,包含反斜杠而不是数字,例如 -

"12\34a56ss7890"

我需要 -

1234567890
4

7 回答 7

3

如果我们假设你在一个字符串中有这个。您可以执行以下操作:

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

这将替换字符串中的所有非数字字符。

于 2012-10-05T15:38:50.810 回答
1
str.replaceAll("[^\d]", "");

bootnote:我不是 Java 开发人员,但正则表达式本身应该是正确的

于 2012-10-05T15:38:24.053 回答
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 转换为字符串并在字符串上调用 this:

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

这应该现在可以工作了:)

于 2012-10-05T15:57:31.237 回答
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

使用正则表达式。

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 回答
0

该字符\34是 string 中的八进制数12\34a56ss7890,因此您可以使用:

str.replaceAll("\034", "34").replaceAll("\\D", "")
于 2012-10-05T15:56:54.980 回答
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 而是一个小矩形 - 当显示控件的文本不知道如何绘制时显示的符号,即所谓的不可打印字符。

这是因为在 String a 中,“\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)。

因此,如果字符串 "12\34a56ss7890" 在屏幕上看起来像这样,您就可以像这样打印出来:

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

这在第二个例子中得到了解决。

但是,如果文字为“12\34a56ss7890”,那么我认为你不能用一个正则表达式来处理它因为如果反斜杠后面跟着一个数字,它会被解释为 \u0000 -\u0009 所以我能做到的最好想想是个很丑的解决方案:

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

第一个 then 替换 (\u0000-\u0009) 可能会被重写为 for 循环以使其看起来更优雅。

+1 一个优秀的问题:)

编辑:实际上,如果反斜杠后跟多个数字,它们都会被解释为一个符号 - 反斜杠后最多三个数字,第四个数字将被视为一个数字。

因此,我的解决方案通常不正确,但可以扩展为。我会在下面推荐 Robin 的解决方案,因为它的效率要高得多。

于 2012-10-05T16:48:50.927 回答