正则表达式在字符串中查找数字

时间:2015-04-30 18:45:29

标签: java regex

我正在使用removeNumbers使用正则表达式删除给定字符串中的所有数字 "(^| )\\d+($|( \\d+)+($| )| )"

以下是代码:

public class Regex {    
  private static String removeNumbers(String s) {
     s = s.trim();
     s = s.replaceAll(" +", " ");
     s = s.replaceAll("(^| )\\d+($|( \\d+)+($| )| )", " ");
     return s.trim();
  }

  public static void main(String[] args) {
     String[] tests = new String[] {"123", "123 456 stack 789", "123 456 789 101112 131415 161718 192021", "stack 123 456 overflow 789 com", "stack 123 456 overflow 789", "123stack 456", "123 stack456overflow", "123 stack456", "123! @456#567"};
     for (int i = 0; i < tests.length; i++) {
        String test = tests[i];
        System.out.println("\"" + test + "\" => \"" + removeNumbers(test) + "\"");
     }  
  }    
}

输出

"123" => ""
" 123 " => ""
"123 456 stack 789" => "stack"
"123 456 789 101112 131415 161718 192021" => ""
"stack 123 456 overflow 789 com" => "stack overflow com"
"stack 123 456 overflow 789" => "stack overflow"
"123stack 456" => "123stack"
"123 stack456overflow" => "stack456overflow"
"123 stack456" => "stack456"
"123! @456#567" => "123! @456#567"

有没有更好的方法呢?

修改

正如@ mbomb007在之前的回答中所建议的那样,正则表达式"( |^)[\\d ]+( |$)"也有效:

private static String removeNumbers(String s) {
   s = s.trim();
   s = s.replaceAll(" +", " ");
   s = s.replaceAll("( |^)[\\d ]+( |$)", " ");
   return s.trim();
}

3 个答案:

答案 0 :(得分:3)

AFAIU,您可以这样做:

private static String removeNumbers(String s) {
    return s.replaceAll("\\b\\d+\\b", "").replaceAll(" +", " ").trim();
}

\b\d+\b匹配一个或多个形成单词的数字。

修改

由于模式不能与"123! @456#567"之类的字符串中的数字匹配,因此可以使用正向后观和前瞻条件的组合:

private static String removeNumbers(String s) {
    return s.replaceAll("(?<= |^)\\d+(?= |$)", " ").replaceAll(" +", " ").trim();
}

答案 1 :(得分:2)

你的正则表达式有点多余(并且也不太适合你的测试用例)。你可以用这个:

"\\b[ ]*(?<![^\\d\\s])[\\d]+(?![^\\d\\s])[ ]*\\b"

\b转义字符表示单词边框(单词的开头或结尾)。我还使用[ ]*来确保删除数字之间的空格。这个正则表达式还允许单词包含数字而不会被替换。就像你想要的那样。

编辑:我添加了一个负面的外观和一个积极的前瞻。

(?<![^\\d\\s]) - 这可以确保数字前面的字符只是更多的数字或空格。

(?![^\\d\\s]) - 这可以确保紧跟数字后面的字符只是更多的数字或空格。

Try it here与您的测试用例。 (更新了添加测试用例的超链接)

答案 2 :(得分:0)

您也可以使用guava库:

 String text = "stack 123 456 overflow 789 com";
 String theLettersWithLargeSpaces = CharMatcher.JAVA_LETTER.or(CharMatcher.WHITESPACE).retainFrom(text); 
 theLetters = CharMatcher.WHITESPACE.collapseFrom(theLettersWithLargeSpaces , ' ');
 System.out.println(theLetters);

我假设不仅可以出现数字,还可以出现其他不需要的字符。输出将是:&#34;堆栈溢出com&#34;

CharMatcher是非常强大的工具。我认为它比正则表达式更具可读性。

如果你只想要一个功能:

public String clearUnwantedChars(String text) {
      return CharMatcher.WHITESPACE.collapseFrom(CharMatcher.JAVA_LETTER.or(CharMatcher.WHITESPACE)
            .retainFrom(text), ' ');
}