我有以下字符串,我想要提取字符串,其中介于 - 和^ 之间。而且我也想要之后的字符串 - ,只要它是给定字符串中的最后一个 - 。
090186-1052^0901164-1052^090180046165-585^0980046166-24064^090186a980046170-24064^00046168-36495^0901846169-46731^0d019616e-34985^8004616f-13010^186a9846167-778
我已经编写了以下代码,但我得到了除了778之外的所有值,而不是null
。
public static void main(String args[]){
Pattern pattern = Pattern.compile("-(.+?)\\^|-(.+)");
String str = "090186-1052^0901164-1052^090180046165-585^0980046166-24064^090186a980046170-24064^00046168-36495^0901846169-46731^0d019616e-34985^8004616f-13010^186a9846167-778";
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
}
答案 0 :(得分:5)
适当的正则表达式是
<p>Output some text from Python in <strong>Markdown</strong>:
<code>python
from sklearn.datasets import load_iris
from sklearn import tree
iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)
clf.predict_proba(iris.data[:1, :])</code></p>
其中显示:Pattern pattern = Pattern.compile("-(.+?)(?:\\^|$)");
后跟任何字符(分组,不情愿),然后是(未捕获)-
或输入结束。
这样匹配的数字总是在第一组中。
答案 1 :(得分:3)
如图here所示,您所追求的号码在第二组中可用。
将代码更改为以下内容可解决问题:
Pattern pattern = Pattern.compile("-(.+?)\\^|-(.+)");
String str = "090186-1052^0901164-1052^090180046165-585^0980046166-24064^090186a980046170-24064^00046168-36495^0901846169-46731^0d019616e-34985^8004616f-13010^186a9846167-778";
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
if(matcher.group(1) != null)
System.out.println(matcher.group(1));
else if(matcher.group(2) != null)
System.out.println(matcher.group(2));
}
收率:
1052
1052
585
24064
24064
36495
46731
34985
13010
778
答案 2 :(得分:2)
您正在使用两组:
-(.+?)\\^|-(.+)
^^^^^ ^^^^
1 2
你的最后一场比赛是在
matcher.group(2)
答案 3 :(得分:0)
另一种方法是将字符串拆分两次:
String[] splitOnDash = str.split("-");
for (int i = 1; i < splitOnDash.length; i++) {
System.out.println(splitOnDash[i].split("\\^")[0]);
}
输出:
1052
1052
585个
24064个
24064个
36495个
46731个
34985个
13010个
778
或者如果你喜欢溪流:
Pattern.compile("-").splitAsStream(str)
.skip(1)
.map(s -> s.split("\\^")[0])
.forEach(System.out::println);