使用正则expression式在Java中提取值

我有几个string粗略的forms:

[some text] [some number] [some more text] 

我想使用Java Regex类在[某些数字]中提取文本。

我大概知道我想使用什么正则expression式(尽pipe欢迎所有的build议)。 我真正感兴趣的是调用正则expression式string的Java调用,并在源数据上使用它来产生[some number]的值。

编辑:我应该补充说,我只对一个[一些数字](基本上,第一个实例)感兴趣。 源string很短,我不会寻找[某些数字]的多次出现。

完整的例子:

 private static final Pattern p = Pattern.compile("^([a-zA-Z]+)([0-9]+)(.*)"); public static void main(String[] args) { // create matcher for pattern p and given string Matcher m = p.matcher("Testing123Testing"); // if an occurrence if a pattern was found in a given string... if (m.find()) { // ...then you can use group() methods. System.out.println(m.group(0)); // whole matched expression System.out.println(m.group(1)); // first expression from round brackets (Testing) System.out.println(m.group(2)); // second one (123) System.out.println(m.group(3)); // third one (Testing) } } 

既然你正在寻找第一个数字,你可以使用这样的正则expression式:

 ^\D+(\d+).* 

m.group(1)会返回你的第一个号码。 请注意,有符号的数字可以包含一个减号:

 ^\D+(-?\d+).* 

Allain基本上有java代码,所以你可以使用它。 然而,只有你的号码前面有一个单词string时,他的expression才会匹配。

 "(\\d+)" 

应该能够find第一个数字串。 如果您确定它将成为第一个数字串,则不需要指定之前的内容。 同样,没有用来指定后面的内容,除非你想要。 如果你只是想要的号码,并确信它将是一个或多个数字的第一个string那么这就是你所需要的。

如果你期望它被空格所抵消,它将使它更明确地指定

 "\\s+(\\d+)\\s+" 

可能会更好。

如果你需要所有三个部分,这将做到:

 "(\\D+)(\\d+)(.*)" 

编辑由Allain和Jack给出的expression式build议您需要指定一些非数字子集来获取数字 。 如果你告诉正在寻找的正则expression式引擎,那么它将忽略数字之前的所有东西。 如果J或A的expression式符合你的模式,那么整个匹配等于 inputstring 。 而且没有理由指定它。 如果没有完全忽略它,它可能会减慢干净的匹配。

 import java.util.regex.Matcher; import java.util.regex.Pattern; public class Regex1 { public static void main(String[]args) { Pattern p = Pattern.compile("\\d+"); Matcher m = p.matcher("hello1234goodboy789very2345"); while(m.find()) { System.out.println(m.group()); } } } 

输出:

 1234 789 2345 

在Java 1.4及更高版本中:

 String input = "..."; Matcher matcher = Pattern.compile("[^0-9]+([0-9]+)[^0-9]+").matcher(input); if (matcher.find()) { String someNumberStr = matcher.group(1); // if you need this to be an int: int someNumberInt = Integer.parseInt(someNumberStr); } 

除了Pattern ,Java String类还有几个方法可以处理正则expression式,在你的情况下代码将是:

 "ab123abc".replaceFirst("\\D*(\\d*).*", "$1") 

其中\\D是非数字字符。

该函数从string中收集所有匹配的序列。 在这个例子中,它从string获取所有电子邮件地址

  public List<String> GetAllEmails(String a_Value) { final String EMAIL_PATTERN = "[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})"; List<String> result = null; Matcher m = Pattern.compile(EMAIL_PATTERN).matcher(a_Value); if (m.find()) { result = new ArrayList<String>(); result.add(m.group()); while(m.find()) { result.add(m.group()); } } return result; } 

对于a_Value = "adf@gmail.com, alamakota@interia.pl, name@ofofofo.pl, <another@osiem.osiem>>>> lalala@aaa.pl" ,它将创build5个元素的列表。

尝试做这样的事情:

 Pattern p = Pattern.compile("^.+(\\d+).+"); Matcher m = p.matcher("Testing123Testing"); if (m.find()) { System.out.println(m.group(1)); } 

看你可以使用StringTokenizer来做到这一点

 String str = "as:"+123+"as:"+234+"as:"+345; StringTokenizer st = new StringTokenizer(str,"as:"); while(st.hasMoreTokens()) { String k = st.nextToken(); // you will get first numeric data ie 123 int kk = Integer.parseInt(k); System.out.println("k string token in integer " + kk); String k1 = st.nextToken(); // you will get second numeric data ie 234 int kk1 = Integer.parseInt(k1); System.out.println("new string k1 token in integer :" + kk1); String k2 = st.nextToken(); // you will get third numeric data ie 345 int kk2 = Integer.parseInt(k2); System.out.println("k2 string token is in integer : " + kk2); } 

由于我们将这些数字数据分成三个不同的variables,我们可以在代码中的任何地方使用这些数据(供进一步使用)

简单的scheme

 // Regexplanation: // ^ beginning of line // \\D+ 1+ non-digit characters // (\\d+) 1+ digit characters in a capture group // .* 0+ any character String regexStr = "^\\D+(\\d+).*"; // Compile the regex String into a Pattern Pattern p = Pattern.compile(regexStr); // Create a matcher with the input String Matcher m = p.matcher(inputStr); // If we find a match if (m.find()) { // Get the String from the first capture group String someDigits = m.group(1); // ...do something with someDigits } 

解决scheme在一个实用类

 public class MyUtil { private static Pattern pattern = Pattern.compile("^\\D+(\\d+).*"); private static Matcher matcher = pattern.matcher(""); // Assumptions: inputStr is a non-null String public static String extractFirstNumber(String inputStr){ // Reset the matcher with a new input String matcher.reset(inputStr); // Check if there's a match if(matcher.find()){ // Return the number (in the first capture group) return matcher.group(1); }else{ // Return some default value, if there is no match return null; } } } ... // Use the util function and print out the result String firstNum = MyUtil.extractFirstNumber("Testing4234Things"); System.out.println(firstNum); 

[^\\d]*([0-9]+[\\s]*[.,]{0,1}[\\s]*[0-9]*).*照顾与小数部分的数字。 我包括空白,并包括尽可能分隔符。 我试图从包含浮动的string中获取数字,并考虑到用户可能犯了一个错误,并在input数字时包含空格。

有时候可以使用java.lang.String中的简单.split(“REGEXP”)方法。 例如:

 String input = "first,second,third"; //To retrieve 'first' input.split(",")[0] //second input.split(",")[1] //third input.split(",")[2] 

如果你正在阅读文件,那么这可以帮助你

  try{ InputStream inputStream = (InputStream) mnpMainBean.getUploadedBulk().getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); String line; //Ref:03 while ((line = br.readLine()) != null) { if (line.matches("[AZ],\\d,(\\d*,){2}(\\s*\\d*\\|\\d*:)+")) { String[] splitRecord = line.split(","); //do something } else{ br.close(); //error return; } } br.close(); } } catch (IOException ioExpception){ logger.logDebug("Exception " + ioExpception.getStackTrace()); } 
 Pattern p = Pattern.compile("(\\D+)(\\d+)(.*)"); Matcher m = p.matcher("this is your number:1234 thank you"); if (m.find()) { String someNumberStr = m.group(2); int someNumberInt = Integer.parseInt(someNumberStr); }