繁体   English   中英

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

[英]Regex to find numbers in a string

我正在使用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();
}

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();
}

您的正则表达式有点多余(也不太适合您的测试用例)。 您可以使用此:

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

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

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

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

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

您的测试用例中尝试一下 (已更新超链接以添加测试用例)

您也可以使用番石榴库来做:

 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);

我假设不仅可以出现数字,而且还可以出现其他不需要的字符。 输出将是:“堆栈溢出com”

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

如果只需要一个功能:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM