gpt4 book ai didi

java - 如何迭代符合正则表达式的字符串

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:47:05 24 4
gpt4 key购买 nike

实现一个类(在 Java 中)的最简单方法是什么,该类将充当符合给定正则表达式的所有值集合的迭代器?

假设我有这样一个类:

public class RegexpIterator
{
private String regexp;

public RegexpIterator(String regexp) {
this.regexp = regexp;
}

public abstract boolean hasNext() {
...
}

public abstract String next() {
...
}
}

我该如何实现?该类假定对所有符合的值的集合进行某种线性排序,并且 next() 方法在第 i 次调用时应返回第 i 个值。

理想情况下,该解决方案应支持完整的正则表达式语法(由 Java SDK 支持)。


为避免混淆,请注意该类不应在给定字符串上迭代给定正则表达式的匹配项。相反,它应该(最终)枚举所有符合正则表达式的字符串值(即会被匹配器的 matches() 方法接受),而不将任何其他输入字符串作为参数给出。


为了进一步阐明问题,让我们举一个简单的例子。

RegexpIterator it = new RegexpIterator("ab?cd?e");
while (it.hasNext()) {
System.out.println(it.next());
}

此代码片段应具有以下输出(行的顺序无关紧要,尽管首先列出较短字符串的解决方案是首选)。

ace
abce
ecde
abcde

请注意,对于某些正则表达式,例如 ab[A-Z]*cd,类要迭代的值集是无限的。在这些情况下,前面的代码片段将永远运行。

最佳答案

你需要实现一个类吗?这种模式效果很好:

    Pattern p = Pattern.compile("[0-9]+");
Matcher m = p.matcher("123, sdfr 123kjkh 543lkj ioj345ljoij123oij");
while (m.find()) {
System.out.println(m.group());
}

输出:

123
123
543
345
123

更通用的解决方案:

public static List<String> getMatches(String input, String regex) {
List<String> retval = new ArrayList<String>();
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
while (m.find()) {
retval.add(m.group());
}
return retval;
}

然后可以这样使用:

public static void main(String[] args) {
List<String> matches = getMatches("this matches _all words that _start _with an _underscore", "_[a-z]*");
for (String s : matches) { // List implements the 'iterable' interface
System.out.println(s);
}
}

产生这个:

_all
_start
_with
_underscore

有关 Matcher 类的更多信息可在此处找到:http://docs.oracle.com/javase/6/docs/api/java/util/regex/Matcher.html

关于java - 如何迭代符合正则表达式的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17453287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com