java 正则表达式数组_Java 创建正则表达式匹配数组

小编典典

(如果你可以假设Java> = 9,则4castle的答案比下面的要好)

你需要创建一个匹配器,并使用它来迭代查找匹配项。

import java.util.regex.Matcher;

import java.util.regex.Pattern;

...

List allMatches = new ArrayList();

Matcher m = Pattern.compile("your regular expression here")

.matcher(yourStringHere);

while (m.find()) {

allMatches.add(m.group());

}

之后,allMatches包含匹配项,allMatches.toArray(new String[0])如果你确实需要一个数组,则可以使用它来获取一个数组。

MatchResult由于Matcher.toMatchResult()返回了当前组状态的快照,因此你还可以编写辅助函数来循环匹配。

例如,你可以编写一个惰性迭代器来完成

for (MatchResult match : allMatches(pattern, input)) {

// Use match, and maybe break without doing the work to find all possible matches.

}

通过做这样的事情:

public static Iterable allMatches(

final Pattern p, final CharSequence input) {

return new Iterable() {

public Iterator iterator() {

return new Iterator() {

// Use a matcher internally.

final Matcher matcher = p.matcher(input);

// Keep a match around that supports any interleaving of hasNext/next calls.

MatchResult pending;

public boolean hasNext() {

// Lazily fill pending, and avoid calling find() multiple times if the

// clients call hasNext() repeatedly before sampling via next().

if (pending == null && matcher.find()) {

pending = matcher.toMatchResult();

}

return pending != null;

}

public MatchResult next() {

// Fill pending if necessary (as when clients call next() without

// checking hasNext()), throw if not possible.

if (!hasNext()) { throw new NoSuchElementException(); }

// Consume pending so next call to hasNext() does a find().

MatchResult next = pending;

pending = null;

return next;

}

/** Required to satisfy the interface, but unsupported. */

public void remove() { throw new UnsupportedOperationException(); }

};

}

};

}

有了这个,

for (MatchResult match : allMatches(Pattern.compile("[abc]"), "abracadabra")) {

System.out.println(match.group() + " at " + match.start());

}

产量

a at 0

b at 1

a at 3

c at 4

a at 5

a at 7

b at 8

a at 10

2020-03-03

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值