如何从 Java 中的字符串中提取 7 个数字的序列?
How to extract a sequence of 7 numbers from a String in Java?
假设我有一些包含 "This sentence was written on 2020-03-21 by person 1234567 at 07:23 hours"
的 String
对象。
我如何只提取字符串的 "1234567"
部分?
也许使用这个 Extract digits from string - StringUtils Java 问题的解决方案,但我不知道如何将提取的数字限制在所需的序列上。
如果我在这个字符串上使用 str.replaceAll("[^0-9]", "")
,我会得到 "2020032112345670723"
,这意味着它提取字符串中的所有数字,但我只想要包含特定数字的序列位数(在我的例子中是 7)。
此外,序列不会总是在同一个地方,所以使用 substring(index from, index to)
是行不通的。
我可能会使用 正则表达式 来做到这一点。对于 \d{7}
甚至更好的七个相邻数字 \b\d{7}\b
(感谢@AlexRudenko)。
为此,您可能需要使用 Pattern
API:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
// ...
Pattern digitPattern = Pattern.compile("\b\d{7}\b");
Matcher m = digitPattern.matcher(<your-string-here>);
while (m.find()) {
String s = m.group();
// prints just your 7 digits
System.out.println(s);
}
我刚刚验证了它,它工作正常。
(模式提取自this answer
你可以做一个简单的 linear search
来找到 length
7:
的 numeric
子串
public static void main(String[] args) {
String str = "This sentence was written on 2020-03-21 by person 1234567 at 07:23 hours";
System.out.println(getNumber(str));
}
private static String getNumber(String str) {
String number = null;
if(str != null)
for(String s : str.split(" "))
if(s.length() == 7 && isNumeric(s))
number = s;
return number;
}
private static boolean isNumeric(String str) {
try {
Integer.parseInt(str);
return true;
} catch(NumberFormatException e){
return false;
}
}
输出:
1234567
假设位数不总是7,我会使用正则表达式
" ([0-9]+) "
里面的部分[0-9]+
找一个或多个数字。它左右的空格确保只有在被空格包围的情况下才能找到该数字,因此输入字符串中的日期和时间将被忽略。括号与 group(1)
到 return 组合使用,仅数字周围没有空格。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main
{
private static final Pattern regexp=Pattern.compile(" ([0-9]+) ");
public static void main(String[] args)
{
String s="This sentence was written on 2020-03-21 by person 1234567 at 07:23 hours";
Matcher matcher=regexp.matcher(s);
if (matcher.find())
{
String number=matcher.group(1);
System.out.printf("number=%s",number);
}
}
}
要仅查找包含 5 - 8 位数字的数字,您可以编写 " ([0-9]{5,8}) "
正如其他人同时写的那样,\d
可以用作 [0-9]
的替代方法。
假设我有一些包含 "This sentence was written on 2020-03-21 by person 1234567 at 07:23 hours"
的 String
对象。
我如何只提取字符串的 "1234567"
部分?
也许使用这个 Extract digits from string - StringUtils Java 问题的解决方案,但我不知道如何将提取的数字限制在所需的序列上。
如果我在这个字符串上使用 str.replaceAll("[^0-9]", "")
,我会得到 "2020032112345670723"
,这意味着它提取字符串中的所有数字,但我只想要包含特定数字的序列位数(在我的例子中是 7)。
此外,序列不会总是在同一个地方,所以使用 substring(index from, index to)
是行不通的。
我可能会使用 正则表达式 来做到这一点。对于 \d{7}
甚至更好的七个相邻数字 \b\d{7}\b
(感谢@AlexRudenko)。
为此,您可能需要使用 Pattern
API:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
// ...
Pattern digitPattern = Pattern.compile("\b\d{7}\b");
Matcher m = digitPattern.matcher(<your-string-here>);
while (m.find()) {
String s = m.group();
// prints just your 7 digits
System.out.println(s);
}
我刚刚验证了它,它工作正常。
(模式提取自this answer
你可以做一个简单的 linear search
来找到 length
7:
numeric
子串
public static void main(String[] args) {
String str = "This sentence was written on 2020-03-21 by person 1234567 at 07:23 hours";
System.out.println(getNumber(str));
}
private static String getNumber(String str) {
String number = null;
if(str != null)
for(String s : str.split(" "))
if(s.length() == 7 && isNumeric(s))
number = s;
return number;
}
private static boolean isNumeric(String str) {
try {
Integer.parseInt(str);
return true;
} catch(NumberFormatException e){
return false;
}
}
输出:
1234567
假设位数不总是7,我会使用正则表达式
" ([0-9]+) "
里面的部分[0-9]+
找一个或多个数字。它左右的空格确保只有在被空格包围的情况下才能找到该数字,因此输入字符串中的日期和时间将被忽略。括号与 group(1)
到 return 组合使用,仅数字周围没有空格。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main
{
private static final Pattern regexp=Pattern.compile(" ([0-9]+) ");
public static void main(String[] args)
{
String s="This sentence was written on 2020-03-21 by person 1234567 at 07:23 hours";
Matcher matcher=regexp.matcher(s);
if (matcher.find())
{
String number=matcher.group(1);
System.out.printf("number=%s",number);
}
}
}
要仅查找包含 5 - 8 位数字的数字,您可以编写 " ([0-9]{5,8}) "
正如其他人同时写的那样,\d
可以用作 [0-9]
的替代方法。