使用正则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); }