[英]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.