Java 正则表达式 - 在字符串中查找数值
Java Regex - find a numeric value in a String
在下面的两个字符串(天气指标)中,我需要用正则表达式找到 "BKN"
之后的第一个 "xxxFT"
值,然后只提取数值:xxxx
第一个字符串的最终值为 2400
,第二个为 700
。
在"BKN"
和"xxxxFT"
之间是否可以添加一个词,这取决于。即:"BKN CB 2400FT"
或 "BKN 700FT"
String str1 = "4000M WX MODTSRA CLD FEW 600FT BKN CB 2400FT BKN CB 2900FT T 21 DP 18 QNH 1010.7HPA MET QFE 1004.1HPA TREND TEMPO MOD TSRA"
String str2 = "1500M CLD BKN 700FT BKN 4600FT T 16 DP 17 QNH 1014.7HPA MET QFE 1004.1HPA TREND TEMPO MOD TSRA"
我可以为此使用哪种正则表达式模式?
更新:
如果您想使用单个正则表达式,请使用以下代码:
Pattern pattern = Pattern.compile("BKN.*?\s+(\d+)FT");
Matcher matcher = pattern.matcher(String1);
if (matcher.find()) {
System.out.println(matcher.group(1));
}
Old 首先你需要得到从 BKN 开始的 SubString 所以
int startIndex = String1.indexOf("BKN");
String str = String1.subString(startIndex);
然后你需要在 BKN 和 FT 之间削减它,以便获得 FT 的索引
startIndex = 0;
int endIndex = str.indexOf("FT")+1;
str = str.subString(startIndex,endIndex);
然后最后您可以使用此正则表达式并从字符串中删除非数字字符
str = str.replaceAll("\D+","");
String1 的输出:2400
String2 的输出:700
参考 Jeutnarg 评论,我们可以通过使用 Matcher 组得到一个没有任何子字符串等的解决方案:
public static void main (String[] args) throws java.lang.Exception
{
String text =
"4000M WX MODTSRA CLD FEW 600FT BKN CB 2400FT BKN CB 2900FT T" +
" 21 DP 18 QNH 1010.7HPA MET QFE 1004.1HPA TREND TEMPO MOD TSRA";
text = "1500M CLD BKN 700FT BKN 4600FT T 16 DP 17 QNH 1014.7HPA MET QFE 1004.1HPA TREND TEMPO MOD TSRA";
String patternString = "BKN.*?\s+(\d+)FT";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
if(matcher.find()) {
System.out.println(matcher.group(1));
} else {
System.out.println("nothing matched");
}
}
输出就是所要求的。相应地,第一个和第二个字符串为 2400 和 700。
如果输入字符串有多个匹配项,那么唯一需要更改的是应该转换为 while 的 if 语句。
while(matcher.find()) {
System.out.println(matcher.group(1));
}
在下面的两个字符串(天气指标)中,我需要用正则表达式找到 "BKN"
之后的第一个 "xxxFT"
值,然后只提取数值:xxxx
第一个字符串的最终值为 2400
,第二个为 700
。
在"BKN"
和"xxxxFT"
之间是否可以添加一个词,这取决于。即:"BKN CB 2400FT"
或 "BKN 700FT"
String str1 = "4000M WX MODTSRA CLD FEW 600FT BKN CB 2400FT BKN CB 2900FT T 21 DP 18 QNH 1010.7HPA MET QFE 1004.1HPA TREND TEMPO MOD TSRA"
String str2 = "1500M CLD BKN 700FT BKN 4600FT T 16 DP 17 QNH 1014.7HPA MET QFE 1004.1HPA TREND TEMPO MOD TSRA"
我可以为此使用哪种正则表达式模式?
更新: 如果您想使用单个正则表达式,请使用以下代码:
Pattern pattern = Pattern.compile("BKN.*?\s+(\d+)FT");
Matcher matcher = pattern.matcher(String1);
if (matcher.find()) {
System.out.println(matcher.group(1));
}
Old 首先你需要得到从 BKN 开始的 SubString 所以
int startIndex = String1.indexOf("BKN");
String str = String1.subString(startIndex);
然后你需要在 BKN 和 FT 之间削减它,以便获得 FT 的索引
startIndex = 0;
int endIndex = str.indexOf("FT")+1;
str = str.subString(startIndex,endIndex);
然后最后您可以使用此正则表达式并从字符串中删除非数字字符
str = str.replaceAll("\D+","");
String1 的输出:2400 String2 的输出:700
参考 Jeutnarg 评论,我们可以通过使用 Matcher 组得到一个没有任何子字符串等的解决方案:
public static void main (String[] args) throws java.lang.Exception
{
String text =
"4000M WX MODTSRA CLD FEW 600FT BKN CB 2400FT BKN CB 2900FT T" +
" 21 DP 18 QNH 1010.7HPA MET QFE 1004.1HPA TREND TEMPO MOD TSRA";
text = "1500M CLD BKN 700FT BKN 4600FT T 16 DP 17 QNH 1014.7HPA MET QFE 1004.1HPA TREND TEMPO MOD TSRA";
String patternString = "BKN.*?\s+(\d+)FT";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
if(matcher.find()) {
System.out.println(matcher.group(1));
} else {
System.out.println("nothing matched");
}
}
输出就是所要求的。相应地,第一个和第二个字符串为 2400 和 700。
如果输入字符串有多个匹配项,那么唯一需要更改的是应该转换为 while 的 if 语句。
while(matcher.find()) {
System.out.println(matcher.group(1));
}