如何在结尾处 - 和^或之后 - 之间获取字符串

时间:2015-10-16 08:51:11

标签: java regex

我有以下字符串,我想要提取字符串,其中介于 - 和^ 之间。而且我也想要之后的字符串 - ,只要它是给定字符串中的最后一个 -

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));
            }
    }

4 个答案:

答案 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);