删除数字序列中的反斜杠

时间:2012-10-05 15:31:51

标签: java regex

正则表达式可以从输入字符串中获取数字序列,包含反斜杠而不是数字,例如 -

"12\34a56ss7890"

我需要 -

1234567890

7 个答案:

答案 0 :(得分:3)

如果我们假设你在String中有这个。你可以这样做:

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

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

答案 1 :(得分:2)

str.replaceAll("[^\d]", "");

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

答案 2 :(得分:2)

很抱歉添加另一个答案,但这是必需的,因为这不适合评论。

我认为这是因为\ 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()));
}

BTW:对不起我的编辑,但是代码中有一点错误。

调用此方法后,您将把InputStream转换为String并在String上调用它:

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

现在应该有效:)

答案 3 :(得分:2)

   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.

答案 4 :(得分:1)

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

str.replaceAll("\034", "34").replaceAll("\\D", "")

答案 5 :(得分:1)

以下示例:

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))它需要是escaped twice而不是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]")

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

+1以获得优秀的问题:)

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

因此,我的解决方案通常不正确,但可以延伸到。我会在下面推荐Robin的解决方案,因为它效率更高。

答案 6 :(得分: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);                 
}