我有粗糙的几个字符串:
[some text] [some number] [some more text]
Run Code Online (Sandbox Code Playgroud)
我想使用Java Regex类在[some number]中提取文本.
我大致知道我想要使用的正则表达式(尽管欢迎所有建议).我真正感兴趣的是Java调用采用正则表达式字符串并在源数据上使用它来产生[某个数字]的值.
编辑:我应该补充一点,我只对一个[某个数字](基本上是第一个实例)感兴趣.源字符串很短,我不会寻找[某些数字]的多次出现.
All*_*nde 302
完整示例:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
既然你正在寻找第一个数字,你可以使用这样的正则表达式:
^\D+(\d+).*
Run Code Online (Sandbox Code Playgroud)
并且m.group(1)会回报你的第一个数字.请注意,带符号的数字可以包含减号:
^\D+(-?\d+).*
Run Code Online (Sandbox Code Playgroud)
jav*_*Man 38
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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
1234
789
2345
Run Code Online (Sandbox Code Playgroud)
Axe*_*man 33
Allain基本上有java代码,所以你可以使用它.但是,只有当您的数字前面只有一个单词字符流时,他的表达才会匹配.
"(\\d+)"
Run Code Online (Sandbox Code Playgroud)
应该能够找到第一个数字串.如果你确定它将是第一个数字串,你不需要指定它之前的内容.同样,除非你想要,否则没有用来指定它之后的内容.如果你只是想要这个号码,并且确定它是一个或多个数字的第一个字符串,那么这就是你所需要的.
如果您希望它被空格偏移,那么它将使指定更加明显
"\\s+(\\d+)\\s+"
Run Code Online (Sandbox Code Playgroud)
可能会更好.
如果你需要这三个部分,这将做:
"(\\D+)(\\d+)(.*)"
Run Code Online (Sandbox Code Playgroud)
编辑 Allain和Jack给出的表达式建议您需要指定一些非数字子集以捕获数字.如果你告诉正在寻找的正则表达式引擎\d那么它将忽略数字之前的所有内容.如果J或A的表达适合你的模式,那么整个比赛等于该输入字符串.并且没有理由指定它.如果没有完全忽略它,它可能会减慢干净的匹配.
Vit*_*nko 11
除了Pattern之外,Java String类还有几个可以使用正则表达式的方法,在这种情况下,代码将是:
"ab123abc".replaceFirst("\\D*(\\d*).*", "$1")
Run Code Online (Sandbox Code Playgroud)
哪里\\D是非数字字符.
Jac*_*eow 10
在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);
}
Run Code Online (Sandbox Code Playgroud)
此函数从字符串中收集所有匹配的序列.在此示例中,它从字符串中获取所有电子邮件地址
static final String EMAIL_PATTERN = "[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})";
public List<String> getAllEmails(String message) {
List<String> result = null;
Matcher matcher = Pattern.compile(EMAIL_PATTERN).matcher(message);
if (matcher.find()) {
result = new ArrayList<String>();
result.add(matcher.group());
while (matcher.find()) {
result.add(matcher.group());
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
因为message = "adf@gmail.com, <another@osiem.osiem>>>> lalala@aaa.pl"它将创建3个元素的列表.
| 归档时间: |
|
| 查看次数: |
280802 次 |
| 最近记录: |